使用JDBC做数据库相关功能开发会做很多重复性的工作,比如创建连接,关闭连接,把字段逐一映射到属性中。 Hibernate把这一切都封装起来了,使得数据库访问变得轻松而简单,代码也更加容易维护。
说白了,hibernate是拿来管数据库的。
配置
首先是导包:
站长准备好的,直接导了就完事= =。
然后创建一个实体类用来映射数据库中对应的表,比如我数据库创了个表product_,那么我就创建个Product类来对应他。
public class Product {
int id;
String name;
float price;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public float getPrice() {
return price;
}
public void setPrice(float price) {
this.price = price;
}
}
然后在这个类的同目录下配置个Product.hbm.xml文件,用来表示上面所说的映射关系:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.how2java.pojo"> //这个是报名
<class name="Product" table="product_"> //实体类 和表名 对应
<id name="id" column="id"> //表示属性的id映射表里面的字段id
<generator class="native">//表示id的自增长采用数据库的本地方式
</generator>
</id>
<property name="name" /> //只写了属性name,没有通过column="name" 显式的指定字段,那么字段的名字也是name.
<property name="price" />
</class>
</hibernate-mapping>
然后在src目录下面创建hibernate.cfg.xml 配置访问数据库要用到的驱动、url、密码等。
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- Database connection settings -->//这下面的几条就是对数据库信息的配置
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost:3306/test?characterEncoding=UTF-8</property>
<property name="connection.username">root</property>
<property name="connection.password">admin</property>
<!-- SQL dialect -->//
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>//这表示使用mysql的方言,hibernate才知道自己要动手的数据库是mysql
<property name="current_session_context_class">thread</property>//这表示hibernate的事务管理方式,表示一个线程一个事物
<property name="show_sql">true</property>//表示在运行的时候 在控制台显示执行的sql语句
<property name="hbm2ddl.auto">update</property>//表示要自动更新数据库的表结构,就是都可以不用自己去创建表了,hibernate会帮你创建
<mapping resource="com/how2java/pojo/Product.hbm.xml" />//这是上面写的映射关系的地方
</session-factory>
</hibernate-configuration>
测试一下,
package com.how2java.test;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import com.how2java.pojo.Product;
public class TestHibernate {
public static void main(String[] args) {
SessionFactory sf=new Configuration().configure().buildSessionFactory();//获取sessionfactory
Session s=sf.openSession();//通过sessionfactory获取一个session
s.beginTransaction();//在session的基础上 开启一个事务
Product p = new Product();
p.setName("iphone7");
p.setPrice(4532);
s.save(p);//session的sava方法,保存到数据库
s.getTransaction().commit();//提交事务
s.close();//关闭session
sf.close();//关闭cf
}
}
插入数据:
就是上面的测试类写的很清楚了,获取sf,获取session,开启事务,sava方法保存到数据库,提交事务,关闭session,关闭sf。
插入十条数据。
package com.how2java.test;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import com.how2java.pojo.Product;
public class TestHibernate {
public static void main(String[] args) {
SessionFactory sf = new Configuration().configure().buildSessionFactory();
Session s = sf.openSession();
s.beginTransaction();
for (int i = 0; i < 10; i++) {
Product p = new Product();
p.setName("iphone"+i);
p.setPrice(i);
s.save(p);
}
s.getTransaction().commit();
s.close();
sf.close();
}
}
对象的三种状态:
实体类在hibernate中有三种状态:瞬时、持久,托管:
瞬时 指的是没有和hibernate发生任何关系,在数据库中也没有对应的记录,一旦JVM结束,这个对象也就消失了,对应上面测试类中的,使用sava方法之前
持久 指得是一个对象和hibernate发生联系,有对应的session,并且在数据库中有对应的一条记录,对应上面测试类当中的,使用sava方法治好,并没有提交事务。这时候在数据库中并没有记录。
严格的说呢,save之后已经在数据库中了,只是还没有通过提交事务把在数据库中的这个数据,”固定“下来。 数据库中之所以差不到,是因为事务的隔离性,”查不到“ 是从其他事务的角度观察到的现象。 持久状态更多的是强调当前对象和session发生了关系,被session管理起来了,所以在没有提交之前,也叫做已经是持久状态了
脱管 指的是一个对象虽然在数据库中有对应的一条记录,但是它所对应的session已经关闭了,对应提交完事务。
package com.how2java.test;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import com.how2java.pojo.Product;
public class TestHibernate {
/**
* @param args
*/
public static void main(String[] args) {
SessionFactory sf = new Configuration().configure().buildSessionFactory();
Session s = sf.openSession();
s.beginTransaction();
Product p = new Product();
p.setName("p1");
System.out.println("此时p是瞬时状态");
s.save(p);
System.out.println("此时p是持久状态");
s.getTransaction().commit();
s.close();
System.out.println("此时p是脱管状态");
sf.close();
}
}
通过id获取对象
调用Session的get方法,根据id获取对象。 除了id之外,还需要传递一个类对象,毕竟需要知道获取的是哪个对象
package com.how2java.test;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.classic.Session;
import com.how2java.pojo.Product;
public class Test2Hibernate {
public static void main(String[] args) {
SessionFactory sf = new Configuration().configure().buildSessionFactory();
Session s = sf. openSession();
s.beginTransaction();
Product p =(Product) s.get(Product.class, 14);//指定类对象,给id,通过get方法获取
System.out.println("id为14的产品是"+p.getName());
s.getTransaction().commit();
s.close();
sf.close();
}
}