1.hibernate持久化类 :一个java类与数据库建立了映射关系
1.1 编写规范
(1)持久化类需要提供无参构造方法。
(2)持久化类的属性需要私有,对私有的属性提供共有的 get 和 set 方法。
(3)持久化类的属性要尽量使用包装类型
(4)持久化类要有一个唯一标识OID与表的主键对应
(5)持久化类尽量不要使用final进行修饰。
(6)一般都实现serializable接口
2.主键生成策略(常用)
(1)native:根据底层数据库类型自动选择一种合适的生成策略
(2)identity:采用自增的方式来维护主键。适合mysql和SQLserver
(3)sequence:采用序列的方式来维护主键。适用Oracle
(4)assigned:表示由程序员自己来维护主键。当没有为id标签指定generator时,默认就是assigned.
(5)increment:hibernate在插入数据前,先查询表中主键最大的值,然后把主键的最大值+1,作为这一次的主键插入到表中。不适合集群的情况。
3.hibernate的一级缓存:hibernate的一级缓存就是指session缓存,作用就是减少对数据库的访问次数。
4.快照机制: hibernate向一级缓存放入数据时,同时复制一份数据放入到hibernate快照中,当使用commit()方法提交事务时,同时会清理session的一级缓存,这是会使用OID判断一级缓存中的对象和快照中的对象是否一致,如果两个对象中的属性发生变化,则执行update语句,将缓存的内容同步到数据库,并更新快照,如果一致,则不执行update语句。hibernate快照的作用就是确保一级缓存中的数据和数据库中的数据一致。
5.hibernate中对象的三种状态
(1)瞬时态:没有OID,和session没有关系
(2)持久态:有OID,和session有关系
(3)托管态或游离态:有OID,和session没有关系
6.Hibernate事务的管理
6.1 hibernate中设置事物的隔离级别
在核心配置文件中,配置hibernate.connection.isolation属性,设置事务的隔离级别。
<!--
create:每次加载hibernate框架时,先删除表,再建表
create-drop:每次加载hibernate框架时,先删除表,再建表。当sf关闭时再删除表。
update:每次加载hibernate框架时,会验证实体类与表结构是否一致,如果不一致,就更新表结构
validate:每次加载hibernate框架时,会验证实体类与表结构是否一致,如果不一致,就报错
-->
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- read uncommitted:允许读脏数据 1
read committed:不允许读脏数据,不可重复读和虚读会发生 2
repeatable read:不允许脏读、不可重复读,虚读会发生 4
serializable:不可以发生脏读、不可重复读、虚读 8
-->
<property name="hibernate.connection.isolation">4</property>
6.2 hibernate中设置session与当前线程绑定
(1)thread:session对象的生命周期与本都线程绑定
(2)jta:session对象的生命周期与JTA事务绑定
(3)managed:hibernate委托程序来管理session对象的生命周期
1.在配置文件中配置
<!--把session与当前线程绑定-->
<property name="hibernate.current_session_context_class">thread</property>
2. 在HibernateUtils中封装getCurrentSession方法
public static Session getCurrentSession(){
return sf.getCurrentSession();
}
openSession和getCurrentSession区别:
openSession: 在任何情况下, 始终是创建新的session
getCurrentSession: 先检测当前环境里是否有session, 如果有, 就直接把当前线程中的session拿过来使用, 不创建新的session
6.3 Query : HQL查询
Query代表面向对象的一个hibernate查询操作,在hibernate中,通常使用session.createQuery()方法接受一个HQL语句,然后调用Query的list()或uniqueResult()方法执行查询。所谓的HQL语句是Hibernate Query Language缩写,其语法很像SQL语法,但它是完全面向对象的。
使用Query对象的步骤:
(1)获得hibernate的session对象.
(2)表写HQL语句
(3)调用session.createQuery 创建查询对象
(4)如果HQL语句包含参数, 则调用Query的setXxx 设置参数
(5)调用query对象的方法执行查询
HQL语句格式:
把表的名称替换成实体类名称, 把表字段名称换成实体类属性名称, 不要写select *
例如:
SQL:select *from cst_customer where cust_name like ?
HQL:from Customer where custName = ?
6.4 Query中的方法说明
list方法: 该方法用于查询语句, 返回的结果是一个list集合
setter方法: Query接口中提供了一些的setter方法, 用于设置查询语句中的参数, 针对不同的数据类型, 需要用到不同的setter方法
uniqueResult方法: 该方法用于返回唯一的结果, 在确保只有一条记录的查询时可以使用该方法
setFirstResult方法: 方法可以设置获取第一个记录的位置, 也就是表示它从第几条记录开始查询, 默认从0开始计算
setMaxResult方法: 该方法用于设置结果集的最大记录数, 通常与setFirstResult方法结合使用, 用于限制结果集的范围, 以实现分页功能
6.5 Criteria: QBC查询
Criteria是一个完全面向对象,可扩展的条件查询API,通过它完全不需要考虑数据库底层如何实现,以及SQL语句如何编写,它是Hibernate框架的核心查询对象。Criteria 查询,又称为QBC查询(Query By Criteria),它是Hibernate的另一种对象检索方式。
org.hibernate.criterion.Criterion是Hibernate提供的一个面向对象查询条件接口,一个单独的查询就是Criterion接口的一个实例,用于限制Criteria对象的查询,在Hibernate中Criterion对象的创建通常是通过Restrictions 工厂类完成的,它提供了条件查询方法。
通常,使用Criteria对象查询数据的主要步骤,具体如下:
(1)获得Hibernate的Session对象。
(2)通过Session获得Criteria对象。
(3)使用Restrictions的静态方法创建Criterion条件对象。Restrictions类中提供了一系列用于设定查询条件的静态方法,这些静态方法都返回Criterion实例,每个Criterion实例代表一个查询条件。
(4)向Criteria对象中添加Criterion 查询条件。Criteria的add()方法用于加入查询条件。
(5)执行Criterita的 list() 或uniqueResult() 获得结果。
7. 对象导航查询: 对象导航检索方式是根据已经加载的对象, 导航到他关联的对象. 它利用类与类之间的关系来检索对象.
要求: 两个对象之间必须存在关联关系
问题1: 查询一方时, 要不要把多方查询出来
分析: 如果查出来, 不使用时就会白白浪费服务器的内寸.
解决 : 采用延迟加载的思想. 通过配置的方式来设定当我们在需要的时候, 发起真正的查询.
配置文件里使用lazy属性: lazy = true (默认)
问题2: 查询多方时, 要不要把一方查询出来
分析: 如果查出来, 一个对象不会消耗太多内存. 而且多数情况下我们都是要使用的.
解决: 采用立即加载思想. 通过配置的方式来设定, 只要查询从表实体, 就把主表实体对象同时查出来.
配置文件里使用lazy属性: lazy = false. 把true改成false
附录:QBC常用查询条件说明
短语 | 含义 |
Restrictions.eq | 等于= |
Restrictions.allEq | 使用Map,使用key/value进行多个等于的判断 |
Restrictions.gt | 大于> |
Restrictions.ge | 大于等于>= |
Restrictions.lt | 小于< |
Restrictions.le | 小于等于<= |
Restrictions.between | 对应sql的between子句 |
Restrictions.like | 对应sql的like子句 |
Restrictions.in | 对应sql的in子句 |
Restrictions.and | and 关系 |
Restrictions.or | or关系 |
Restrictions.sqlRestriction | Sql限定查询 |
Restrictions.asc() | 根据传入的字段进行升序排序 |
Restrictions.desc() | 根据传入的字段进行降序排序 |
运算类型 | HQL运算符 | QBC运算方法 |
比较运算 | = | Restrictions.eq() |
<> | Restrictions.not(Restrictions.eq()) | |
>= | Restrictions.ge() | |
< | Restrictions.lt() | |
<= | Restrictions.le() | |
is null | Restrictions.isNull() | |
is not null | Restrictions.isNotNull() | |
范围运算符 | in | Restrictions.in() |
not in | Restrictions.not(Restrictions.in()) | |
between | Restrictions.between() | |
not between | Restrictions.not(Restrictions.between()) |
运算类型 | HQL运算符 | QBC运算方法 |
字符串模式匹配 | like | Restrictions.like() |
逻辑 | and | Restrictions.and()| Restrictions.conjunction() |
or | Restrictions.or()| Restrictions.disjunction() | |
not | Restrictions.not() | |
|
|