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的访问方式。
分享到:
相关推荐
在实际应用中,DAO(Data Access Object)类通常会使用HibernateTemplate。例如,以下是一个简单的`PersonDAOImpl`类的示例: ```java public class PersonDAOImpl implements PersonDAO { private static Log log...
### 关于使用HibernateTemplate #### 一、简介与背景 在Java企业级应用开发中,持久层技术扮演着至关重要的角色。其中,Hibernate作为一款优秀的ORM(Object Relational Mapping)框架,极大地简化了数据访问层的...
1. **HibernateTemplate**:是Spring框架提供的用于简化Hibernate使用的模板类。它提供了大量操作数据库的方法,包括查询、更新等,并且内置了事务管理机制。 2. **分组统计**:指通过SQL语句对查询结果按照一个或多...
### HibernateTemplate 的详细介绍与使用范围 #### 一、概述 在Spring框架中,`HibernateTemplate`作为ORM(Object Relational Mapping)技术中的一个重要组件,它提供了简化Hibernate操作的方法集,使得开发人员...
### HibernateTemplate 的方法使用 #### 一、简介与配置方式 **HibernateTemplate** 是 Spring 框架中用于简化 Hibernate 使用的一个工具类。它通过 AOP(面向切面编程)的思想,封装了大量的 CRUD(创建、读取、...
通过上述介绍,我们可以看到`HibernateTemplate`的强大之处在于它不仅简化了Hibernate的集成与使用,还提供了一系列实用的方法来满足不同的业务需求。在实际项目开发中,合理利用这些方法可以大大提升开发效率和代码...
HibernateTemplate是Spring框架提供的一种操作Hibernate的方式,它简化了Hibernate的使用过程,使开发者无需关注Session的管理与事务控制,极大地提高了开发效率。本文将对HibernateTemplate的主要用法进行详细介绍...
使用`HibernateTemplate`可以减少大量模板代码的编写,提高开发效率。 #### 三、HibernateTemplate核心功能详解 ##### 1. 增删改查基础操作 `HibernateTemplate`提供了多种方法来执行基本的数据库操作: - **...
### HibernateTemplate类的使用详解 #### 一、引言 在Java开发中,持久层框架Hibernate因其优秀的ORM(Object-Relational Mapping)特性被广泛应用。为了更便捷地使用Hibernate,Spring框架提供了一系列工具类来简化...
HibernateTemplate 是 Spring 框架中的一個关键组件,用于简化 Hibernate 的使用,提供了許多实用的方法来进行数据库操作。在本文中,我们将对 HibernateTemplate 的主要方法进行总结和解释。 ...
HibernateTemplate的简单示例
`HibernateTemplate`是Spring框架提供的一个强大的工具,它不仅简化了Hibernate的使用,还提供了异常转换、资源管理等功能,使得开发人员能够更加专注于业务逻辑的编写。通过对`HibernateTemplate`的学习和使用,...
在Hibernate框架中,`HibernateTemplate`提供了一种更为简洁、易于使用的API,用于执行基本的CRUD(创建、读取、更新、删除)操作。对于批量删除数据,`HibernateTemplate`提供了`bulkUpdate()`方法,该方法通过执行...
在这个框架中,HibernateTemplate是Spring提供的一个工具类,它简化了Hibernate的使用,使得开发者可以更方便地进行数据库操作,如增删改查。接下来,我们将深入探讨如何在SSH2中使用HibernateTemplate进行这些基本...
hibernateTemplate常用方法.htm
本示例将深入探讨如何使用Spring将SessionFactory注入到HibernateTemplate中,从而实现数据库操作的便捷管理。 首先,让我们了解几个关键组件: 1. SessionFactory:这是Hibernate的核心工厂类,用于创建Session...
与JdbcTemplate不同,HibernateTemplate使用了Hibernate ORM,可以直接操作对象,而不是SQL语句。它可以自动处理对象的持久化、加载、更新和删除等操作,使得数据库操作更符合面向对象的思维模式。此外,它还提供了...
GenericHibernateDao 继承 HibernateDao,简单封装 HibernateTemplate 各项功能,简化基于Hibernate Dao 的编写。
3. **HibernateTemplate使用**:HibernateTemplate是Spring提供的用于简化Hibernate使用的类,它提供了一系列方便的方法来执行常见的CRUD操作,从而降低了代码的复杂度。 4. **DAO层设计**:最后,在业务逻辑层...