1、持久化类:就是一个Java类(咱们编写的JavaBean),这个Java类与表建立了映射关系就可以成为是持久化类。
持久化类 = JavaBean +xxx.hbm.xml
2、持久化类的编写规则**
1. 提供一个无参数 public访问控制符的构造器。底层需要进行反射.
2. 提供一个标识属性,映射数据表主键字段。唯一标识OID.数据库中通过主键.Java对象通过地址确定对象.持久化类通过唯一标识OID确定记录
3. 所有属性提供public访问控制符的 set或者get方法
4. 标识属性应尽量使用基本数据类型的包装类型
3、Hibernate的持久化类的状态。Hibernate为了管理持久化类:将持久化类分成了三个状态
1、瞬时态:TransientObject:没有持久化标识OID, 没有被纳入到Session对象的管理
* 获得瞬时态的对象User user = new User()
* 瞬时态对象转换持久态save()/saveOrUpdate();
* 瞬时态对象转换成脱管态 user.setId(1)
2、持久态:Persistent Object:有持久化标识OID,已经被纳入到Session对象的管理.
3、脱管态:Detached Object:有持久化标识OID,没有被纳入到Session对象的管理.
4、持久态对象具有自动更新数据库的能力,不用session.xx操作
4Session对象的一级缓存(重点)
1. 什么是缓存?
* 其实就是一块内存空间,将数据源(数据库或者文件)中的数据存放到缓存中.再次获取的时候 ,直接从缓存中获取.可以提升程序的性能!
2. Hibernate框架提供了两种缓存
* 一级缓存 -- 自带的不可卸载的.一级缓存的生命周期与session一致.一级缓存称为session级别的缓存.
* 二级缓存 -- 默认没有开启,需要手动配置才可以使用的.二级缓存可以在多个session中共享数据,二级缓存称为是sessionFactory级别的缓存.
3. Session对象的缓存概述
* Session接口中,有一系列的java的集合,这些java集合构成了Session级别的缓存(一级缓存).将对象存入到一级缓存中,session没有结束生命周期,那么对象在session中存放着
* 内存中包含Session实例 --> Session的缓存(一些集合) --> 集合中包含的是缓存对象!
4. 证明一级缓存的存在,编写查询的代码即可证明
* 在同一个Session对象中两次查询,可以证明使用了缓存
5. Hibernate框架是如何做到数据发生变化时进行同步操作的呢?
* 使用get方法查询User对象
* 然后设置User对象的一个属性,注意:没有做update操作。发现,数据库中的记录也改变了。
* 利用快照机制来完成的(SnapShot)
5使用Hibernate框架解决丢失更新的问题
* 乐观锁
1.在对应的JavaBean中添加一个属性,名称可以是任意的。例如:private Integer version; 提供get和set方法
2.在映射的配置文件中,提供<version name="version"/>标签即可。
6 绑定本地的Session
现在的Hibernate框架中,使用session对象开启事务,所以需要来传递session对象,框架提供了ThreadLocal的方式
1、需要在hibernate.cfg.xml的配置文件中提供配置
<propertyname="hibernate.current_session_context_class">thread</property>
2、重新HibernateUtil的工具类,使用SessionFactory的getCurrentSession()方法,获取当前的Session对象。并且该Session对象不用手动关闭,线程结束了,会自动关闭。
public static SessiongetCurrentSession(){
returnfactory.getCurrentSession();
}
3、注意:想使用getCurrentSession()方法,必须要先配置才能使用。
7、Query查询接口
1. 具体的查询代码如下 // 1.查询所有记录 /*Query query = session.createQuery("from Customer"); List<Customer> list = query.list(); System.out.println(list);*/ // 2.条件查询: /*Query query = session.createQuery("from Customer where name = ?"); query.setString(0, "李健"); List<Customer> list = query.list(); System.out.println(list);*/ // 3.条件查询: /*Query query = session.createQuery("from Customer where name = :aaa and age = :bbb"); query.setString("aaa", "李健"); query.setInteger("bbb", 38); List<Customer> list = query.list(); System.out.println(list);*/
8、Criteria查询接口(非常适合做条件查询)
1. 具体的查询代码如下 // 1.查询所有记录 /*Criteria criteria = session.createCriteria(Customer.class); List<Customer> list = criteria.list(); System.out.println(list);*/ // 2.条件查询 /*Criteria criteria = session.createCriteria(Customer.class); criteria.add(Restrictions.eq("name", "李健")); List<Customer> list = criteria.list(); System.out.println(list);*/ // 3.条件查询 /*Criteria criteria = session.createCriteria(Customer.class); criteria.add(Restrictions.eq("name", "李健")); criteria.add(Restrictions.eq("age", 38)); List<Customer> list = criteria.list(); System.out.println(list);*/
戒骄戒躁