HibernateTemplate还提供一种更加灵活的方式来操作数据库,通过这种方式可以完全使用Hibernate的操作方式。这种灵活方式主要是通过如下两个方法完成的:
(1)
- Object execute(HibernateCallback action)
Object execute(HibernateCallback action)
(2)
- List executeFind(HibernateCallback action)
List executeFind(HibernateCallback action)
HibernateCallback实例可在任何有效的Hibernate数据访问中使用。程序开发者通过HibernateCallBack,可以完全使用Hibernate灵活的方式来访问数据库,解决Spring封装Hibernate后灵活性不足的缺陷。
HibernateCallback是个接口,该接口包含一个方法doInHibernate(org.hibernate.Session session),该方法只有一个参数Session。
注意:
在doInHibernate方法内可访问Session,该Session对象是绑定到该线程的Session实例。在该方法内的持久层操作,与不使用Spring时的持久化操作完全相同。这保证了对于复杂的持久化层访问,依然可以使用Hibernate的访问方式。
下面是有一个HibernateDaoSupport扩展类(增加了三个分页查询的方法):
-
-
public class ExtendHibernateDaoSupport extends HibernateDaoSupport{
-
-
-
-
-
-
-
-
public List findByPage(final String hql, final int offset, final int pageSize){
-
- List list = getHibernateTemplate().executeFind(
-
new HibernateCallback(){
-
public Object doInHibernate(Session session)throws HibernateException, SQLException{
- List result = session.createQuery(hql)
- .setFirstResult(offset)
- .setMaxResults(pageSize)
- .list();
-
return result;
- }
- });
-
return list;
- }
-
-
-
-
-
-
-
-
-
-
public List findByPage(final String hql, final Object value,final int offset, final int pageSize){
-
-
List list = getHibernateTemplate().executeFind(new HibernateCallback(){
-
public Object doInHibernate(Session session)throws HibernateException, SQLException{
-
List result = session.createQuery(hql)
-
.setParameter(0,value)
- .setFirstResult(offset)
- .setMaxResults(pageSize)
- .list();
-
return result;
- }
- });
-
return list;
- }
-
-
-
-
-
-
-
-
-
-
-
public List findByPage(final String hql, final Object[] values,final int offset, final int pageSize){
-
-
List list = getHibernateTemplate().executeFind(new HibernateCallback(){
-
-
public Object doInHibernate(Session session)throws HibernateException, SQLException{
-
- Query query = session.createQuery(hql);
-
-
for(int i=0; i<values.length; i++){
- query.setParamter(i,values[i]);
- }
- List result = query.setFirstResult(offset)
- .setMaxResults(pageSize)
- .list();
-
return result;
- }
- });
-
return list;
- }
//==============================================
public class ExtendHibernateDaoSupport extends HibernateDaoSupport{
/**
使用hql进行分页查询
@param hql 需要查询的hql语句
@param offset 第一条记录索引
@param pageSize 当前需要显示的记录数
@return 当前页的所有记录 */
public List findByPage(final String hql, final int offset, final int pageSize){
//通过一个HibernateCallback对象来执行查询
List list = getHibernateTemplate().executeFind(
new HibernateCallback(){//实现HibernateCallback接口必须实现的方法
public Object doInHibernate(Session session)throws HibernateException, SQLException{//执行Hibernate分页查询
List result = session.createQuery(hql)
.setFirstResult(offset)
.setMaxResults(pageSize)
.list();
return result;
}
});
return list;
}
/**
使用hql进行分页查询
@param hql 需要查询的hql语句
@param value 如果hql有一个参数需要传入,value就是传入hql语句的参数
@param offset 第一条记录索引
@param pageSize 当前需要显示的记录数
@return 当前页的所有记录
*/
public List findByPage(final String hql, final Object value,final int offset, final int pageSize){
//通过一个HibernateCallback对象来执行查询
List list = getHibernateTemplate().executeFind(new HibernateCallback(){//实现HibernateCallback接口必须实现的方法
public Object doInHibernate(Session session)throws HibernateException, SQLException{//执行Hibernate分页查询
List result = session.createQuery(hql)//为hql语句传入参数
.setParameter(0,value)
.setFirstResult(offset)
.setMaxResults(pageSize)
.list();
return result;
}
});
return list;
}
/**
使用hql进行分页查询
@param hql 需要查询的hql语句
@param values 如果hql有多个参数需要传入,values就是传入hql语句的参数数组
@param offset 第一条记录索引
@param pageSize 当前需要显示的记录数
@return 当前页的所有记录
*/
public List findByPage(final String hql, final Object[] values,final int offset, final int pageSize){
//通过一个HibernateCallback对象来执行查询
List list = getHibernateTemplate().executeFind(new HibernateCallback(){
//实现HibernateCallback接口必须实现的方法
public Object doInHibernate(Session session)throws HibernateException, SQLException{
//执行Hibernate分页查询
Query query = session.createQuery(hql);
//为hql语句传入参数
for(int i=0; i<values.length; i++){
query.setParamter(i,values[i]);
}
List result = query.setFirstResult(offset)
.setMaxResults(pageSize)
.list();
return result;
}
});
return list;
}
注意:Spring提供的XxxTemplate和XxxCallBack互为补充,XxxTemplate对通用操作进行封装,而XxxCallBack解决了封装后灵活性不足的缺陷。
分享到:
相关推荐
HibernateCallback使用方法
第24次课-1 Spring与Hibernate的整合 本节主要内容 24.1 概述 24.2 管理SessionFactory 24.3 Spring对Hibernate的简化 ...1. Spring中是怎么对Hibernate进行支持的? 2. 如何进行Spring与Hibernate的整合?
6.5 Spring整合Hibernate 6.6 Spring提供的DAO支持 6.5.2 管理Hibernate的...6.5.4 使用HibernateCallBack 6.5.6 使用IoC容器组装各种组件 6.5.7启动web容器读取xml配置文件 6.5.8了解继承自HibernateDaoSupport类DAO
3在Spring中使用org.springframework.jdbc.support.lob.OracleLobHandler处理Oracle数据库的Blob类型字段。 通过这样的设置和配置,我们就可以象持久化表的一般字段类型一样处理Blob字段了。 以上是Spring+...
对Spring框架中,HibernateTemplate的使用,底层dao中HibernateTemplate的使用以及HibernateCallBack调用等等
弃用了struts,用spring mvc框架做了几个项目,感觉都不错,而且使用了注解方式,可以省掉一大堆配置文件。本文主要介绍使用注解方式配置的spring mvc,之前写的spring3.0 mvc和rest小例子没有介绍到数据层的内容,...
HibernateCallback HibernateDaoSupport HibernateDaoSupport HibernateInterceptor HibernateInterceptor HibernateJdbcException HibernateJdbcException HibernateJpaDialect HibernateJpaVendorAdapter ...
Hibernate3.6.10用到的jiar antlr-2.7.6.jar,commons-collections-3.1, commons-logging-1.1.3, dom4j-1.6.1, ejb3-persistence, hibernate-jpa-2.0-api-1.0.1.Final, hibernate3, javassist-3.12.0.GA, jta...
return template.execute(new HibernateCallback<List<News>>() { public List<News> doInHibernate(Session session) throws HibernateException,SQLException { List<News> list = null; Query query...