Spring使用HibernateCallBack

本文探讨了如何利用Spring框架中的XxxTemplate和XxxCallback接口,将Hibernate的数据库操作进行灵活封装,以增强其在复杂场景下的适应性和效率。通过引入自定义的HibernateDaoSupport扩展类,实现了分页查询的三种不同方式,充分展示了如何在保持灵活性的同时,整合Spring和Hibernate的优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[url]http://blog.163.com/xiaokangzhijia@126/blog/static/1659548562011041749567/[/url]

HibernateTemplate还提供一种更加灵活的方式来操作数据库,通过这种方式可以完全使用Hibernate的操作方式。这种灵活方式主要是通过如下两个方法完成的:

(1)
Object execute(HibernateCallback action)


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

/**
使用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解决了封装后灵活性不足的缺陷。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值