`
bolan392
  • 浏览: 273713 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Spring中使用HibernateCallback

阅读更多

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

(1)

Java代码 复制代码 收藏代码
  1. Object execute(HibernateCallback action)  
Object execute(HibernateCallback action)



(2)

Java代码 复制代码 收藏代码
  1. 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扩展类(增加了三个分页查询的方法):

Java代码 复制代码 收藏代码
  1. //==============================================   
  2.     public class ExtendHibernateDaoSupport extends HibernateDaoSupport{     
  3.              
  4.         /**        
  5.         使用hql进行分页查询        
  6.         @param hql 需要查询的hql语句        
  7.         @param offset 第一条记录索引        
  8.         @param pageSize 当前需要显示的记录数        
  9.         @return 当前页的所有记录   */            
  10.         public List findByPage(final String hql, final int offset, final int pageSize){   
  11.                 //通过一个HibernateCallback对象来执行查询           
  12.                 List list = getHibernateTemplate().executeFind(   
  13.                         new HibernateCallback(){//实现HibernateCallback接口必须实现的方法   
  14.                             public Object doInHibernate(Session session)throws HibernateException, SQLException{//执行Hibernate分页查询   
  15.                                 List result = session.createQuery(hql)   
  16.                                 .setFirstResult(offset)   
  17.                                 .setMaxResults(pageSize)   
  18.                                 .list();   
  19.                                 return result;   
  20.                                 }   
  21.                             });   
  22.                 return list;          
  23.         }          
  24.         /**        
  25.         使用hql进行分页查询        
  26.         @param hql 需要查询的hql语句        
  27.         @param value 如果hql有一个参数需要传入,value就是传入hql语句的参数        
  28.         @param offset 第一条记录索引        
  29.         @param pageSize 当前需要显示的记录数        
  30.         @return 当前页的所有记录        
  31.         */     
  32.              
  33.         public List findByPage(final String hql, final Object value,final int offset, final int pageSize){   
  34.                 //通过一个HibernateCallback对象来执行查询          
  35.                 List list = getHibernateTemplate().executeFind(new HibernateCallback(){//实现HibernateCallback接口必须实现的方法    
  36.                     public Object doInHibernate(Session session)throws HibernateException, SQLException{//执行Hibernate分页查询    
  37.                         List result = session.createQuery(hql)//为hql语句传入参数    
  38.                         .setParameter(0,value)   
  39.                         .setFirstResult(offset)   
  40.                         .setMaxResults(pageSize)   
  41.                         .list();   
  42.                         return result;   
  43.                         }   
  44.                     });   
  45.                 return list;          
  46.         }         
  47.         /**   
  48.            
  49.         使用hql进行分页查询       
  50.         @param hql 需要查询的hql语句        
  51.         @param values 如果hql有多个参数需要传入,values就是传入hql语句的参数数组        
  52.         @param offset 第一条记录索引        
  53.         @param pageSize 当前需要显示的记录数        
  54.         @return 当前页的所有记录        
  55.         */     
  56.              
  57.         public List findByPage(final String hql, final Object[] values,final int offset, final int pageSize){   
  58.                 //通过一个HibernateCallback对象来执行查询          
  59.                 List list = getHibernateTemplate().executeFind(new HibernateCallback(){           
  60.                                         //实现HibernateCallback接口必须实现的方法   
  61.                     public Object doInHibernate(Session session)throws HibernateException, SQLException{          
  62.                                                //执行Hibernate分页查询   
  63.                         Query query = session.createQuery(hql);          
  64.                                                 //为hql语句传入参数    
  65.                         for(int i=0; i<values.length; i++){   
  66.                             query.setParamter(i,values[i]);   
  67.                             }   
  68.                         List result = query.setFirstResult(offset)   
  69.                         .setMaxResults(pageSize)   
  70.                         .list();   
  71.                         return result;   
  72.                         }   
  73.                     });   
  74.                 return list;         
  75.         }     
//==============================================
	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解决了封装后灵活性不足的缺陷。

分享到:
评论
6 楼 leongfeng 2014-04-07  
xd_fjx 写道
如果使用那个HibernateCallback是为了得到hibernate的session的话,那直接用getSession()也能得到session,不知道二者有什么区别。

貌似用getSession()关了之后,就不能再启动了
5 楼 ccjjxlg 2013-10-31  
8888
4 楼 ccjjxlg 2013-10-31  
7777
3 楼 ccjjxlg 2013-10-31  
[color=olive][/color]
2 楼 ccjjxlg 2013-10-31  
HibernateTemplate还提供一种更加灵活的方式来操作数据库,通过这种方式可以完全使用Hibernate的操作方式。这种灵活方式主要是通过如下两个方法完成的:

(1)    
1 楼 xd_fjx 2013-09-15  
如果使用那个HibernateCallback是为了得到hibernate的session的话,那直接用getSession()也能得到session,不知道二者有什么区别。

相关推荐

    HibernateCallback使用方法

    HibernateCallback使用方法

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

    第24次课-1 Spring与Hibernate的整合 本节主要内容 24.1 概述 24.2 管理SessionFactory 24.3 Spring对Hibernate的简化 ...1. Spring中是怎么对Hibernate进行支持的? 2. 如何进行Spring与Hibernate的整合?

    Spring整合Hibernate 详解.doc

    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

    ssh(structs,spring,hibernate)框架中的上传下载

    3在Spring中使用org.springframework.jdbc.support.lob.OracleLobHandler处理Oracle数据库的Blob类型字段。  通过这样的设置和配置,我们就可以象持久化表的一般字段类型一样处理Blob字段了。  以上是Spring+...

    HibernateTemplate详细描述以及使用范围

    对Spring框架中,HibernateTemplate的使用,底层dao中HibernateTemplate的使用以及HibernateCallBack调用等等

    spring_MVC源码

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

    SPRING API 2.0.CHM

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

    Hibernate3.6.10用到的jiar

    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&lt;List&lt;News&gt;&gt;() { public List&lt;News&gt; doInHibernate(Session session) throws HibernateException,SQLException { List&lt;News&gt; list = null; Query query...

Global site tag (gtag.js) - Google Analytics