Hibernate(2)

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()

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值