Hibernate的官方网站http://hibernate.org
一、与MyBatis的比较
相对于MyBatis的“SQL-Mapping”的ORM实现,Hibernate的ORM实现更加完善,提供了对象状态管理、级联操作等功能 完全面向对象,语句与数据库无关,开发者无需关注SQL的生成,开发简单,便于修改,数据库移植性好 由于直接使用SQL,MyBatis使用自由度较高
二、搭建Hibernate环境的步骤
1、引入所需的jar文件 2、配置hibernate.cfg.xml 3、创建持久化类并配置相关hbm.xml映射文件 4、在hibernate.cfg.xml中引入hbm.xml映射文件
三、hibernate.cfg.xml文件的配置
<!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> <!-- 数据库url --> <property name="connection.url" > jdbc:mysql://localhost:3306/test1?characterEncoding=utf-8 </property> <!-- 数据库用户 --> <property name="connection.username">root</property> <!-- 数据库用户密码 --> <property name="connection.password">0000</property> <!-- 数据库JDBC驱动 --> <property name="connection.driver_class"> com.mysql.jdbc.Driver </property> <!-- 每个数据库对应其方言 --> <property name="dialect"> org.hibernate.dialect.MySQLDialect </property> <!-- 指定当前session范围和上下文 --> <property name="current_session_context_class">thread</property> <!-- 是否运行期间生成sql输出到日志供调式 --> <property name="show_sql">true</property> <!-- 是否格式化sql --> <property name="format_sql">true</property> <!-- 关闭bean validate验证,因为javaee6有bean-validator.jar这个包,用javae5就没事了, 在Hibernate中默认的 <prop key="javax.persistence.validation.mode">none</prop> 是auto而不是none! --> <property name="javax.persistence.validation.mode">none</property> <!-- mapper映射 --> <mapping resource="com/entity/User.hbm.xml"/> </session-factory> </hibernate-configuration>
四、创建持久化类需要实现(序列化)接口
public class User implements java.io.Serializable { private Integer uid; private String uname; private Integer age; private String sex; //省略set/get方法 }
五、创建持久化类的映射文件
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Maping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="com.entity.User" table="user"> <id name="uid" column="uid" type="java.lang.Integer"> <generator class="identity"></generator> </id> <property name="uname" column="uname" type="java.lang.String"></property> <property name="age" column="age" type="java.lang.Integer"></property> <property name="sex" column="sex" type="java.lang.String"></property> </class> </hibernate-mapping>
六、使用Hibernate API(测试类)
public class Test { public static void main(String[] args) { Configuration config = new Configuration().configure(); SessionFactory factory = config.buildSessionFactory(); Session session = factory.openSession(); Transaction tx = session.beginTransaction(); //增加 /*User user = new User(); user.setUname("李四"); user.setAge(14); user.setSex("男"); 返回当前主键值 Serializable id = session.save(user); System.out.println(id);*/ //修改 User u1 = new User(); u1.setUname("张dsf"); u1.setAge(12); u1.setSex("男"); session.save(u1); System.out.println(u1); //查所有 hql /*List<User> users = session.createQuery("from User").list(); for (User user : users) { System.out.println(user); }*/ //查所有 sql /*List<User> users = session.createSQLQuery("select * from user").addEntity(User.class).list(); for (User user : users) { System.out.println(user); }*/ //查一个 //User u = session.get(User.class, 2); //User uu = (User)session.load(User.class, 2); //System.out.println(uu); //删除 /*User u2 = new User(); u2.setUid(4); session.delete(u2); System.out.println("over");*/ tx.commit(); session.close(); } }
七、查询时get()方法和load()方法的区别
1、区别一
当使用Session的get()方式时,如果加载的数据不存在,则会返回null;
使用Session的load()方法时,如果加载的数据不存在,则会抛出异常,
2、区别二
get()方法时及时加载
load()方法时延时加载
八、Hibernate中Java对象的三种状态
1:瞬时态
与session无关,与数据库无关,对对象的更变不会映射到数据库,特点是没有主键;
2:持久态*
与session有关,与数据库有关,对对象的更变会映射到数据库,当然有主键,获得的方式,get、load、save等;
3:游离态
曾经与session有关,曾经与数据库有关,总是从持久态演变过来的,对对象的更变不会映射到数据库;
九、脏检查与刷新缓存
Session是hibernate向应用程序提供的持续化操纵的主要接口,它提供了基本的保存、更新、删除和加载java对象的方法,Session具有一个缓存,可以管理和跟踪所有持久化的对象。 当对象被加入到Session中时,Session会为当前持久化的对象的值类型的属性复制一份快照。操作中,如果持久化的对象的属性发生改变,那么当前的 持久化对象即为脏对象,在事物提交时,Hibernate会对Session中持久化状态的对象进行检测,即比较当前持久化对象的当前属性与它的快照,以判断 对象的属性是否发生的变化,这种判断成为脏检查,则Session会根据脏对象的最新属性值来执行相关额SQL语句,将变化更新到数据库中,一确保内存 中的对象数据和数据库中的数据一致。 注意:当Session缓存中对象的属性发生变化时,Session并不会立即执行脏检查和执行相关的SQL语句,而是在特定的时间点,即刷新缓存时才执行; 当刷新缓存(调用Session的flush()方法)时,Hiberante会对Session中持久状态的对象进行检测,判断对象的数据是否发生了改变;
commit()方法会首先刷新缓存; 刷新缓存就是将数据库同步为与Session缓存一致; 刷新缓存时会执行脏检查; Session会在以下时间点刷新缓存; 调用Session的flush()方法; 调用Transaction的commit()方法;
十、使用Session接口的saveOrUpdate()、merge()方法
saveOrUpdate()方法 如果对象有主键就会执行update 如果对象没主键就会执行save update()方法 常规修改 merge()方法 类似动态修改(联想动态sql)