Hibernate查询操作
HQL查询
Hibernate Query Language,面向对象查询语言。
SQL Strctor Query Language 结构化查询语言。
HQL和SQL语法结构是一致的,支持
select...
from...
where...
group by...
having...
order by...
HQL和SQL语法的不同
- HQL使用类和属性名字、SQL使用表和字段名字
- HQL中类和属性名是区分大小写的、SQL表和字段名不区分
- HQL支持max、min、avg、count、sum分组函数,但不支持数据库日期、字符串等函数、也不支持sysdate、now()等关键字
- HQL不支持select * 写法、支持select count(*),如果需要取所有记录可以省略select子句
- HQL不支持join...on...写法中的on子句,需要使用关联映射
SQL: select * from NOTE
HQL: from Note
SQL: select context,publish_time from NOTE where ID=?
HQL: select context,publishTime from Note where id=?
Query query = session.createQuery(hql);
Criteria查询
条件查询,基于方法指定查询数据源、条件、排序等等。
Criteria ct = session.createCriteria(Note.class);
NativeSQL查询
原生SQL查询
SQLQuery sqlQuery = session.createSQLQuery(sql);
Hibernate注解应用
-
注解标记
@Entity
@Table
@Id
@GeneratedValue
@Column -
加载映射描述信息
hibernate.cfg.xml中
< mapping class="cn.xdl.entity.Note"/>
Hibernate特性
-
延迟加载
数据在执行一些查询时,有些API方法具有延迟特性,执行完方法后并没有立刻发送SQL加载数据,而是在使用对象数据时才会发送SQL加载数据。
session.load()//延迟机制=session.get()//立刻加载
query.iterator()//延迟机制=query.list()//立刻加载
关联映射查询操作//延迟机制
延迟加载方法应用,经常会遇到下面问题。
org.hibernate.LazyInitializationException: could not initialize proxy - no Session产生原因是:session关闭过早,导致发送SQL实例化失败
请求-->Filter-->Action-->DAO(不关session)-->Result-->JSP(EL)-->关闭session
方案:可以用Filter过滤器、拦截器、AOP技术实现控制session关闭。(OpenSessionInView方案) Spring框架提供了一个OpenSessionInViewFilter组件,可以回收session资源,支持延迟加载操作。(在web.xml配置即可)
public void doFilter(){ chain.doFilter();//调用servlet/jsp //sessoin.close(); }
-
持久化
在Hibernate框架中,实体对象会有三种存在状态。

-
临时状态(Transient) new Xxx();
-
持久状态 (Persistent) 跟session发生关联,load/get/save/update
特点:垃圾回收器不能回收、对象属性信息可以更新数据库
同步时机:session.flush(),tx.commit()内部会自动调用flush().
-
游离状态 (Detached) 本来是持久状态,但是却调用了clear/evict/close方法
-
-
缓存(性能优化)
-
一级缓存(自动启用)
每个Session都有一个缓存区,被称为一级缓存区。生成周期跟着Session一致。缓存区是Session对象独享。
优点:查询同一个对象多次,第一次查数据库,后续查缓存
缓存和持久化关系:缓存中的对象具有持久化状态的。将对象从缓存移除,对象就变为游离。
手动管理缓存的方法:evict()\clear()\close
-
二级缓存
-
查询缓存
-
Spring+Hibernate整合

HibernateTemplate
-
引入spring和hibernate开发包和配置文件
参考示例中的
pom.xml//jar包导入
applicationContext.xml//spring配置文件
hibernate.cfg.xml//hibernate配置文件 -
编写实体类和映射描述信息
参考示例中Note.java
-
在Spring中配置HibernateTemplate组件
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate4.HibernateTemplate"> <property name="sessionFactory" ref="sessionFactory"></property> </bean> -
在Spring中配置SessionFactory组件
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> <!-- 指定连接池 --> <property name="dataSource" ref="c3p0"> </property> <!-- 指定hibernate.cfg.xml,删除数据库链接参数 --> <property name="configLocations" value="classpath:hibernate.cfg.xml"> </property> -
配置DataSource组件
<bean id="c3p0" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="user" value="root"></property> <property name="password" value="1234"></property> <property name="driverClass" value="com.mysql.jdbc.Driver"></property> <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/studyonline?useUnicode=true&characterEncoding=utf8"></property> </bean> -
使用HibernateTemplate对象操作
- find(hql,params)//执行hql
- save
- delete
- update
- load/get
可以去编写NoteDao接口和实现类,将HibernateTemplate注入完成数据库操作
AOP事务管理
<bean id="txManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<!-- 支持@Transactional -->
<tx:annotation-driven transaction-manager="txManager"
proxy-target-class="true"/>
在ListAction或DeleteAction追加@Transactional标记就可以了