您的位置:首页 > 其它

HibernateTemplate 的使用

2013-03-15 16:27 399 查看
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的访问方式。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: