`

Spring使用HibernateCallBack

阅读更多
http://blog.163.com/xiaokangzhijia@126/blog/static/1659548562011041749567/

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解决了封装后灵活性不足的缺陷。
分享到:
评论

相关推荐

    HibernateCallback使用方法

    HibernateCallback 使用方法 HibernateCallback 是 Hibernate 框架中的一种 callback 机制,允许开发者在持久层访问时执行自定义操作。HibernateCallback 是 Spring 框架中与 Hibernate 整合的重要组件,通过它可以...

    使用Spring进行数据访问

    2. **ORM集成**:Spring通过`HibernateTemplate`和`HibernateCallback`支持Hibernate,简化了事务管理和对象关系映射。同样,对于MyBatis,Spring提供`SqlSessionFactoryBean`和`SqlSessionTemplate`来整合MyBatis,...

    spring配置文件详解

    例如,在配置 Hibernate 模板时,我们使用了 HibernateCallback 对象来执行 Hibernate 操作。这使得我们的应用程序更加灵活和可维护。 Spring 配置文件是 Spring 框架中最重要的配置文件之一,负责定义和配置应用...

    spring_MVC源码

    弃用了struts,用spring mvc框架做了几个项目,感觉都不错,而且使用了注解方式,可以省掉一大堆配置文件。本文主要介绍使用注解方式配置的spring mvc,之前写的spring3.0 mvc和rest小例子没有介绍到数据层的内容,...

    Spring对DAO的支持.doc

    使用Spring的JDBC模板,可以避免在DAO实现类中直接编写SQL语句,而是将它们作为字符串常量,这样可以提高代码的可读性和可维护性。 ### 3. Spring对Hibernate的DAO支持 Spring通过HibernateTemplate和...

    Spring整合Hibernate 详解.doc

    Spring通过提供一系列的DAO抽象类,如HibernateDaoSupport,HibernateTemplate以及HibernateCallBack,使得开发者可以更方便地实现DAO组件。这些抽象类作为DAO实现类的基类,降低了开发难度,确保了代码的一致性和可...

    Spring/泛型Hibernate的实现

    ### 泛型Hibernate的...本文详细介绍了如何实现泛型Hibernate,并将其与Spring框架集成,以及如何使用Maven构建工程。通过这些技术的应用,开发者可以更加高效地进行数据库操作,同时保证代码的可维护性和可扩展性。

    第24次课-1 Spring与Hibernate的整合

    开发者通过HibernateCallback,可以完全使用Hibernate灵活的方式来访问数据库,解决了Spring封装Hibernate后灵活性不足的缺陷。 24.3 Spring对Hibernate的简化 24.3.4 HibernateTemplate的复杂用法 ...

    Spring整合hibernate

    随着Hibernate的更新,特别是SessionFactory.getCurrentSession()的出现,可以直接在Spring的事务范围内获取和管理Session,使得直接使用HibernateAPI成为可能。 2. **使用SessionFactory.getCurrentSession()** ...

    Spring3.0新特性

    - **一致性的使用**:在 Spring 中,现在可以一致性地使用泛型集合和映射、泛型 FactoryBeans 以及解决 Spring AOP API 中的桥接方法问题。 - **事件监听器的改进**:GenericApplicationListeners 现在只接收特定...

    spring+hibernate详解

    本文详细介绍了Spring与Hibernate集成的过程,包括如何配置`SessionFactory`、使用`HibernateTemplate`简化数据操作、通过`HibernateDaoSupport`提高代码可维护性以及利用`HibernateCallback`实现更复杂的业务逻辑。...

    struts2和spring整合

    这里的`x-x-x`应该替换为实际使用的Spring版本号,例如`struts2-spring-plugin-2.5.18.jar`。 ##### 2. 配置SessionFactory 在Spring框架中,`SessionFactory`是创建`Session`的基础,通常在配置文件(如`...

    spring structs hibernate 整合

    此外,Spring还提供了HibernateTemplate和HibernateCallback接口,使得事务管理变得更加简单。在`applicationContext.xml`中,我们需要配置Hibernate的相关bean,如SessionFactory、DataSource等。 对于Struts和...

    Spring基础:数据访问(2)

    - **Hibernate**:Spring通过HibernateTemplate和HibernateCallback接口,提供了对Hibernate的集成,使得我们可以利用Spring的DI和AOP来管理SessionFactory和Session。 - **MyBatis**:Spring支持MyBatis的...

    Spring学习笔记

    Spring学习笔记详细知识点如下: 1. 面向接口编程(面向抽象编程): 面向接口编程是面向对象编程的一种重要实践,它鼓励开发者通过接口而不是具体实现来编写程序...掌握这些知识点对于学习和使用Spring框架至关重要。

    struts2.3+spring3.1.2+hibernate4.1.6 配置说明

    在这个配置说明中,开发者使用的是Struts2.3、Spring3.1.2和Hibernate4.1.6的版本。 首先,我们需要了解这三大框架的基本作用: - **Struts2**:是一个基于MVC(Model-View-Controller)设计模式的Web应用框架,...

    Struts+Spring+Hibernate之选课系统

    Spring还支持使用回调机制(如HibernateCallback)处理特殊查询和分页。 Hibernate的核心在于对象关系映射,它允许我们将Java对象直接映射到数据库表。开发者需要正确配置实体类(Entity)和数据访问对象(DAO),...

    hibernate+spring实现分页

    - 利用Spring的 `HibernateCallback` 来执行特定的数据库操作。 #### 四、具体实现 1. **PageBean类**: ```java public class PageBean { private int count = 0; private int pageSize = 20; private int ...

    SPRING API 2.0.CHM

    HibernateCallback HibernateDaoSupport HibernateDaoSupport HibernateInterceptor HibernateInterceptor HibernateJdbcException HibernateJdbcException HibernateJpaDialect HibernateJpaVendorAdapter ...

Global site tag (gtag.js) - Google Analytics