HibernateTemplate 的使用

1.HibernateTemplate的常规用法
HibernateTemplate提供非常多的常用方法来完成基本的操作,比如通常的增加、删除、修改、查询等操作,Spring 2.0更增加对命名SQL查询的支持,也增加对分页的支持。大部分情况下,使用Hibernate的常规用法,就可完成大多数DAO对象的CRUD操作。下面是HibernateTemplate的常用方法简介:

void delete(Object entity):删除指定持久化实例

deleteAll(Collection entities):删除集合内全部持久化类实例

find(String queryString):根据HQL查询字符串来返回实例集合

findByNamedQuery(String queryName):根据命名查询返回实例集合

get(Class entityClass, Serializable id):根据主键加载特定持久化类的实例

save(Object entity):保存新的实例

saveOrUpdate(Object entity):根据实例状态,选择保存或者更新

update(Object entity):更新实例的状态,要求entity是持久状态

setMaxResults(int maxResults):设置分页的大小

例:
//根据值班日和班次获取列表
public List getOpeRecsByCon(Date dutyDay,String dutyId){
log.debug("finding OpeRecords instances by Condition");
try {
String queryString = "from OpeRecords o where o.dutyday=? and o.dutyid=?";
return getHibernateTemplate().find(queryString,new Object[]{dutyDay,dutyId});
} catch (RuntimeException re) {
log.error("find all failed", re);
throw re;
}
}

//综合查询
public List getOpeRecsByCon1(HttpServletRequest request){
log.debug("finding OpeRecords instances by Condition");
try {

String factoryId = request.getParameter("factoryId");
String spciltyId = request.getParameter("spciltyId");
String dutyId = request.getParameter("dutyId");
String classId = request.getParameter("classId");

StringBuffer queryString = new StringBuffer();
queryString.append("from OpeRecords o where 1=1");

//如果选择了运行单位和专业
if((factoryId.length()!=0)&&(spciltyId.length()!=0)){
queryString.append(" and o.modelid in (select a.modelid from Opemodel a where a.runfactory='"+factoryId+"' and a.specialtyid='"+spciltyId+"')");
}

//如果仅仅选择了运行单位
if((factoryId.length()!=0)&&(spciltyId.length()==0)){
queryString.append(" and o.modelid in (select a.modelid from Opemodel a where a.runfactory='"+factoryId+"')");
}

//如果仅仅选择了专业
if((factoryId.length()==0)&&(spciltyId.length()!=0)){
queryString.append(" and o.modelid in (select a.modelid from Opemodel a where a.specialtyid='"+spciltyId+"')");
}

//如果选择了班次
if(dutyId.length()!=0){
queryString.append(" and o.dutyid='"+dutyId+"'");
}

//如果选择了值别
if(classId.length()!=0){
queryString.append(" and o.classid='"+classId+"'");
}

String startTimeStr = request.getParameter("startTime");
String endTimeStr = request.getParameter("endTime");


queryString.append(" and o.gettime between ? and ?");

Date startTime = StringToDate.StrToDate4yyyyMMddHHmmss(startTimeStr);
Date endTime = StringToDate.StrToDate4yyyyMMddHHmmss(endTimeStr);

return getHibernateTemplate().find(queryString.toString(),new Object[]{startTime,endTime});
} catch (RuntimeException re) {
log.error("find all failed", re);
throw re;
}
}

注意:以上方法只支持HQL,不支持原生SQL

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

q      Object execute(HibernateCallback action)

q      List execute(HibernateCallback action)

这两个方法都需要一个HibernateCallback的实例,HibernateCallback实例可在任何有效的Hibernate数据访问中使用。程序开发者通过HibernateCallback,可以完全使用Hibernate灵活的方式来访问数据库,解决Spring封装Hibernate后灵活性不足的缺陷。HibernateCallback是一个接口,该接口只有一个方法doInHibernate(org.hibernate.Session session),该方法只有一个参数Session。

通常,程序中采用实现HibernateCallback的匿名内部类来获取HibernateCallback的实例,方法doInHibernate的方法体就是Spring执行的持久化操作。具体代码如下:

//逻辑删除部门实例
public void logicDelete(String ids) {
        log.debug("logicDelete deleting SysDept instance");
        try {
        String inString="";
        if(ids!=null&&!ids.equals("")){
        String[] idsArray=ids.split(",");
        if(idsArray!=null&&idsArray.length>=1){
        for(int i=0;i<idsArray.length-1;i++){
                inString =inString+"'"+idsArray[i]+"',";
                }
        inString =inString+"'"+idsArray[idsArray.length-1]+"'";
        final String QueryString="update SysDept s set delFlag='Y' where s.id in("+inString+")";
        getHibernateTemplate().execute(new HibernateCallback() {
                    public Object doInHibernate(Session s) throws HibernateException, SQLException {
                      Query query = s.createQuery(QueryString);
                      query.executeUpdate();
                      return null;
                    }
                  });
        }
        }
            log.debug("logicDelete successful");
        } catch (RuntimeException re) {
            log.error("logicDelete failed", re);
            throw re;
        }
    }

//通过id列表查询部门实例列表
    public List findBySpecifyIds(String ids) {
        log.debug("finding SysDept list by specify ids");
        try {
        final String[] idsArray=ids.split(",");
        return getHibernateTemplate().executeFind(new HibernateCallback() {
              public Object doInHibernate(Session s) throws HibernateException {
                Criteria c = s.createCriteria(SysDept.class);
                c.add(Restrictions.in("id",idsArray));
               
                return c.list();
              }
            });
        } catch (RuntimeException re) {
            log.error("find by ids failed", re);
            throw re;
        }
    }


public List getList(){  
        return (List ) <SPAN class=hilite1>getHibernateTemplate</SPAN>().execute(  
                new HibernateCallback() {  
                    public List doInHibernate(final Session s)  
                            throws HibernateException, SQLException {  

StringBuffer sb = new StringBuffer();  
Query query = s.createSQLQuery(sb.toString());//<STRONG>执行普通sql</STRONG>  
Query query = s.createQuery(sb.toString());//   <STRONG>执行hql </STRONG>  
List list = query.list();  
return list ;  
                    }  
                });           
    }
采用这种做法的好处是:不用关心事务。session的创建和销毁,一切都在程序内部完成。看看名字doInHibernate就知道好处了。不好的是程序看起来比较乱!个人认为。  

注意:方法doInHibernate方法内可以访问Session,该Session对象是绑定到该线程的Session实例。该方法内的持久层操作,与不使用Spring时的持久层操作完全相同。这保证对于复杂的持久层访问,依然可以使用Hibernate的访问方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值