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 是 Spring 框架中与 Hibernate 整合的重要组件,通过它可以实现灵活的持久层访问。 在 Hibernate 中,SessionFactory 是一个非常重要的对象,它是单个数据库映射关系编译后的内存镜像。大部分...
在IT行业中,Spring框架是Java开发领域中广泛使用的开源框架,尤其在企业级应用中扮演着核心角色。本文将深入探讨如何使用Spring进行数据访问,包括其数据访问组件的使用、配置以及最佳实践。 首先,Spring框架提供...
例如,在配置 Hibernate 模板时,我们使用了 HibernateCallback 对象来执行 Hibernate 操作。这使得我们的应用程序更加灵活和可维护。 Spring 配置文件是 Spring 框架中最重要的配置文件之一,负责定义和配置应用...
使用Spring的JDBC模板,可以避免在DAO实现类中直接编写SQL语句,而是将它们作为字符串常量,这样可以提高代码的可读性和可维护性。 ### 3. Spring对Hibernate的DAO支持 Spring通过HibernateTemplate和...
Spring整合Hibernate是现代Java开发中常见的一种技术组合,利用Spring框架的强大功能来管理和协调Hibernate的持久化操作。Spring为Hibernate提供了全面的集成方案,简化了DAO(Data Access Object)的开发,同时也...
弃用了struts,用spring mvc框架做了几个项目,感觉都不错,而且使用了注解方式,可以省掉一大堆配置文件。本文主要介绍使用注解方式配置的spring mvc,之前写的spring3.0 mvc和rest小例子没有介绍到数据层的内容,...
在Spring的配置文件中,可以通过如下方式来配置Hibernate和Spring的集成: ```xml <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:...
通常,程序中采用实现HibernateCallback的匿名内部类来获取HibernateCallback的实例,方法doInHibernate()就是Spring执行的持久化操作。 24.3 Spring对Hibernate的简化 24.3.5 HibernateDaoSupport Spring为与...
- **一致性的使用**:在 Spring 中,现在可以一致性地使用泛型集合和映射、泛型 FactoryBeans 以及解决 Spring AOP API 中的桥接方法问题。 - **事件监听器的改进**:GenericApplicationListeners 现在只接收特定...
在Spring框架中整合Hibernate是为了提供更高效、便捷的数据访问和事务管理能力。Spring整合Hibernate主要有以下三种方式: 1. **使用HibernateTemplate** HibernateTemplate是Spring早期为了简化Hibernate操作而...
本文详细介绍了Spring与Hibernate集成的过程,包括如何配置`SessionFactory`、使用`HibernateTemplate`简化数据操作、通过`HibernateDaoSupport`提高代码可维护性以及利用`HibernateCallback`实现更复杂的业务逻辑。...
此外,Spring还提供了HibernateTemplate和HibernateCallback接口,使得事务管理变得更加简单。在`applicationContext.xml`中,我们需要配置Hibernate的相关bean,如SessionFactory、DataSource等。 对于Struts和...
例如,在DAO实现类中使用`HibernateTemplate`: ```java public class PersonDaoImpl implements PersonDao { private HibernateTemplate hibernateTemplate; @Autowired public void setSessionFactory...
- 在Spring测试框架中,我们可以使用如SqlSessionFactoryBean的setup和cleanup方法,或者@Sql和@Rollback注解,来准备测试环境和清理数据,确保测试的隔离性。 以上就是“Spring基础:数据访问(2)”的核心内容,它...
Spring中的bean有完整的生命周期,包括创建、初始化、使用和销毁等阶段。可以通过配置init-method和destroy-method来定义初始化和销毁时的方法。lazy-init属性可以配置bean是否延迟初始化。 9. Annotation: ...
在这个配置说明中,开发者使用的是Struts2.3、Spring3.1.2和Hibernate4.1.6的版本。 首先,我们需要了解这三大框架的基本作用: - **Struts2**:是一个基于MVC(Model-View-Controller)设计模式的Web应用框架,...
- 利用Spring的 `HibernateCallback` 来执行特定的数据库操作。 #### 四、具体实现 1. **PageBean类**: ```java public class PageBean { private int count = 0; private int pageSize = 20; private int ...
在企业级应用开发中,Struts2、Hibernate 和 Spring(通常简称为 SSH 框架)是三个非常重要的技术栈。它们各自解决不同的问题,并且通过良好的集成可以构建出高效、稳定的应用系统。本文将详细介绍如何在 Struts2 + ...
3在Spring中使用org.springframework.jdbc.support.lob.OracleLobHandler处理Oracle数据库的Blob类型字段。 通过这样的设置和配置,我们就可以象持久化表的一般字段类型一样处理Blob字段了。 以上是Spring+...