Spring中使用HibernateCallback

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

(1)

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



(2)

Java代码  复制代码  收藏代码
  1. List executeFind(HibernateCallback action)  
Java代码   收藏代码
  1. 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.         }     
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.         }     



注意:Spring提供的XxxTemplate和XxxCallBack互为补充,XxxTemplate对通用操作进行封装,而XxxCallBack解决了封装后灵活性不足的缺陷。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值