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属性,设置事务的隔离级别。
update
4
6.2 hibernate中设置session与当前线程绑定
(1)thread:session对象的生命周期与本都线程绑定
(2)jta:session对象的生命周期与JTA事务绑定
(3)managed:hibernate委托程序来管理session对象的生命周期
1.在配置文件中配置
thread
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
短语 |
含义 |
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() |
|
|
|