`
wxinpeng
  • 浏览: 589681 次
  • 性别: Icon_minigender_1
  • 来自: 青岛
社区版块
存档分类
最新评论

Hibernate 的 Dao 简写

阅读更多

Spring 为了简写SSH中的DAO层,提供了HibernateDaoSupport类。让我们基本上可以一句话就可以完成对数据库的一个原子操作(增,删,改,查)。代码写久之后就发现,每个类中都有代码相似度达90%的(增,删,改,查)的5个方法。(查是两个方法)。既然代码中只是 类名不同而已。想到用泛型抽象。另外,HibernateDaoSupport对分页的支持不是很好,现重新书写一下。代码如下:

 

DAO  的接口:

 

/**
 * 使用泛型编写 Dao中的增删改查。
 * 
 * @author Administrator
 * 
 * @param <T>
 */
public interface EntityDao<T> {
	/**
	 * 保存对象。
	 * @param o 要保存的对象
	 * @return 返回保存的状态
	 */
	Integer save(T o);
	/**
	 * 更新对象。
	 * @param o 要更新的对象
	 * @return  返回更新的状态
	 */
	Integer update(T o);
	/**
	 * 删除对象。
	 * @param o 要删除的对象
	 * @return  返回删除的状态
	 */
	Integer delete(T o); 
	/**
	 * 根据ID查询对象。
	 * @param id 要查询对象的ID
	 * @return	  返回查询的对象。
	 */
	T get(Integer id);
	/**
	 * 根据HQL查询对象
	 * @param HQL  要查询的HQL语句
	 * @return     返回查询的对象。
	 */
	List<T> find();
	
}

 DAO 的实现类:

 

@SuppressWarnings({ "unchecked", "hiding" })
public class EntityDaoSupport<T> extends MyHibernateDaoSupport implements
		EntityDao<T> {
	// 泛型的Class
	private Class<T> entityClass;

	// 根据反射得到泛型的class.
	public EntityDaoSupport() {
		entityClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
	}

	@Override
	public  Integer delete(T o) {
		this.getHibernateTemplate().delete(o);
		return 1;
	}

	@Override
	public  List<T> find() {
		List<T> list = this.getHibernateTemplate().find("from " + entityClass.getName());
		if (list != null && list.size() > 0) {
			return list;
		}
		return null;
	}
	@Override
	public  T get(Integer id) {
		T o = (T) this.getHibernateTemplate().get(entityClass, id);
		return o;
	}
	@Override
	public  Integer save(T o) {
		Serializable result=this.getHibernateTemplate().save(o);
		if(result!=null){
			return 1;
		}
		return 0;
	}

	@Override
	public  Integer update(T o) {
		this.getHibernateTemplate().saveOrUpdate(o);
		return 1;
	}
	/**
	 * 根据给定的HQL查询。
	 * @param HQL  要查询的HQL语句
	 * @return	      返回查询对象的集合。
	 */
	public T get(String HQL) {
		List<T>list=this.getHibernateTemplate().find(HQL);
		if(list!=null && list.size()>0){
			return list.get(0);
		}
		return null;
	}
	/**
	 * 查询所有的对象。
	 * @return 返回查询对象的集合。
	 */
	public List<T> find(String HQL) {
		List<T> list = this.getHibernateTemplate().find(HQL);
		if (list != null && list.size() > 0) {
			return list;
		}
		return null;
	}
	/**
	 * 根据给定的HQL语句及参数查询。
	 * @param HQL  要查询的HQL语句
	 * @param arg  需要带入的参数
	 * @return     返回查询对象的集合。
	 */
	public List<T> find(String HQL, Object arg) {
		List<T> list = this.getHibernateTemplate().find(HQL,arg);
		if (list != null && list.size() > 0) {
			return list;
		}
		return null;
	}
	/**
	 * 根据给定的HQL语句及参数查询。
	 * @param HQL  要查询的HQL语句
	 * @param args 需要带入的参数数组
	 * @return 返回查询对象的集合。
	 */
	public List<T> find(String HQL, Object... args) {
		List<T> list = this.getHibernateTemplate().find(HQL,args);
		if (list != null && list.size() > 0) {
			return list;
		}
		return null;
	}
	/**
	 * 根据HQL查询对象
	 * @param HQL  要查询的HQL语句
	 * @param arg  需要带入的参数
	 * @return     返回查询的对象。
	 */
	public T get(String HQL, Object arg) {
		List<T>list=this.getHibernateTemplate().find(HQL,arg);
		if(list!=null && list.size()>0){
			return list.get(0);
		}
		return null;
	}
	/**
	 * 根据HQL查询对象
	 * @param HQL  要查询的HQL语句
	 * @param args 需要带入的参数(数组)
	 * @return     返回查询的对象。
	 */
	public T get(String HQL, Object... args) {
		List<T>list=this.getHibernateTemplate().find(HQL,args);
		if(list!=null && list.size()>0){
			return list.get(0);
		}
		return null;
	}
	/**
	 * 执行HQL语句,执行执行Insert,Delete,Update 动作。
	 * @param HQL  要执行的HQL语句
	 * @return	      返回执行的状态
	 */
	public Integer execute(final String HQL) {
		return this.getHibernateTemplate().execute(new HibernateCallback<Integer>() {
			@Override
			public Integer doInHibernate(Session session) throws HibernateException,SQLException {
				Query query=session.createQuery(HQL);
				prepareQuery(query);
				return query.executeUpdate();
			}
		});
	}
	
	/**
	 * 执行HQL语句,执行执行Insert,Delete,Update 动作。
	 * @param HQL  要执行的HQL语句
	 * @param arg  带入的参数
	 * @return     返回执行的状态
	 */
	public Integer execute(final String HQL,final Object arg) {
		return this.getHibernateTemplate().execute(new HibernateCallback<Integer>() {
			@Override
			public Integer doInHibernate(Session session) throws HibernateException,SQLException {
				Query query=session.createQuery(HQL);
				prepareQuery(query);
				if(arg!=null){
					query.setParameter(0, arg);
				}
				return query.executeUpdate();
			}
		});
	}

	/**
	 * 执行HQL语句,执行执行Insert,Delete,Update 动作。
	 * @param HQL  要执行的HQL语句
	 * @param args 带入的参数数组
	 * @return     返回执行的状态
	 */
	public Integer execute(final String HQL, final Object... args) {
		return this.getHibernateTemplate().execute(new HibernateCallback<Integer>() {
			@Override
			public Integer doInHibernate(Session session) throws HibernateException,SQLException {
				Query query=session.createQuery(HQL);
				prepareQuery(query);
				if (args != null) {
					for (int i = 0; i < args.length; i++) {
						query.setParameter(i, args[i]);
					}
				}
				return query.executeUpdate();
			}
		});
	}

	/**
	 * 根据给定的HQL语句查询聚合函数(count,sum,max,min,avg..)返回结果
	 * @param HQL  要查询的HQL语句
	 * @return     返回查询的条数
	 */
	public Integer findAgg(String HQL) {
		List<Object>list=this.getHibernateTemplate().find(HQL);
		if(list!=null && list.size()>0){
			Object object=list.get(0);
			if(object!=null){
				return Integer.parseInt(object.toString());
			}
		}
		return 0;
	}
	 
	/**
	 * 根据给定的HQL语句查询聚合函数(count,sum,max,min,avg..)返回结果
	 * @param HQL  要查询的HQL语句
	 * @param arg  带入的参数
	 * @return     返回查询的条数
	 */
	public Integer findAgg(String HQL, Object arg) {
		List<Object>list=this.getHibernateTemplate().find(HQL,arg);
		if(list!=null && list.size()>0){
			Object object=list.get(0);
			if(object!=null){
				return Integer.parseInt(object.toString());
			}
		}
		return 0;
	}

	/**
	 * 根据给定的HQL语句查询聚合函数(count,sum,max,min,avg..)返回结果
	 * @param HQL  要查询的HQL语句
	 * @param args 带入的参数(数组)
	 * @return     返回查询的条数
	 */
	public Integer findAgg(String HQL, Object... args) {
		List<Object>list=this.getHibernateTemplate().find(HQL,args);
		if(list!=null && list.size()>0){
			Object object=list.get(0);
			if(object!=null){
				return Integer.parseInt(object.toString());
			}
		}
		return 0;
	}
	/**
	 * 分页查询
	 * @param HQL           要查询的HQL语句
	 * @param maxResults	最大显示的行数
	 * @param firstResult	查询开始的行数
	 * @return              返回查询的集合
	 */
	public List<T> find(final String HQL, final Integer maxResults, final Integer firstResult) {
		return this.getHibernateTemplate().executeWithNativeSession(new HibernateCallback<List<T>>() {
			@Override
			public List<T> doInHibernate(Session session)throws HibernateException, SQLException {
				Query query=session.createQuery(HQL);
				prepareQuery(query);
				query.setMaxResults(maxResults);
				query.setFirstResult(firstResult);
				List<T>list=query.list();
				if(list!=null && list.size()>0){
					return list;
				}
				return null;
			}
		});
	}
	
	/**
	 * 分页查询
	 * @param HQL          要查询的HQL语句
	 * @param maxResults   最大显示的行数
	 * @param firstResult  查询开始的行数
	 * @param arg          带入的参数
	 * @return             返回查询的集合
	 */
	public List<T> find(final String HQL, final Integer maxResults, final Integer firstResult,
			final Object arg) {
		return this.getHibernateTemplate().executeWithNativeSession(new HibernateCallback<List<T>>() {
			@Override
			public List<T> doInHibernate(Session session)throws HibernateException, SQLException {
				Query query=session.createQuery(HQL);
				prepareQuery(query);
				query.setMaxResults(maxResults);
				query.setFirstResult(firstResult);
				if(arg!=null){
					query.setParameter(0, arg);
				}
				List<T>list=query.list();
				if(list!=null && list.size()>0){
					return list;
				}
				return null;
			}
		});
	}

	/**
	 * 分页查询
	 * @param HQL          要查询的HQL语句
	 * @param maxResults   最大显示的行数
	 * @param firstResult  查询开始的行数
	 * @param args         带入的参数(数组)
	 * @return             返回查询的集合
	 */
	public List<T> find(final String HQL, final Integer maxResults, final Integer firstResult,
			final Object... args) {
		return this.getHibernateTemplate().executeWithNativeSession(new HibernateCallback<List<T>>() {
			@Override
			public List<T> doInHibernate(Session session)throws HibernateException, SQLException {
				Query query=session.createQuery(HQL);
				prepareQuery(query);
				query.setMaxResults(maxResults);
				query.setFirstResult(firstResult);
				if(args!=null){
					for(int i=0;i<args.length;i++){
						query.setParameter(i, args[i]);
					}
				}
				List<T>list=query.list();
				if(list!=null && list.size()>0){
					return list;
				}
				return null;
			}
		});
	}

	/**
	 * Prepare the given Query object, applying cache settings and/or
	 * a transaction timeout.
	 * @param queryObject the Query object to prepare
	 * @see #setCacheQueries
	 * @see #setQueryCacheRegion
	 * @see SessionFactoryUtils#applyTransactionTimeout
	 */
	protected void prepareQuery(Query queryObject) {
		HibernateTemplate hibernateTemplate=this.getHibernateTemplate();
		if (hibernateTemplate.isCacheQueries()) {
			queryObject.setCacheable(true);
			if (hibernateTemplate.getQueryCacheRegion() != null) {
				queryObject.setCacheRegion(hibernateTemplate.getQueryCacheRegion());
			}
		}
		if (hibernateTemplate.getFetchSize() > 0) {
			queryObject.setFetchSize(hibernateTemplate.getFetchSize());
		}
		if (hibernateTemplate.getMaxResults() > 0) {
			queryObject.setMaxResults(hibernateTemplate.getMaxResults());
		}
		SessionFactoryUtils.applyTransactionTimeout(queryObject, getSessionFactory());
	}

	/**
	 * 执行SQL语句
	 * @param sql 要执行的sql语句
	 * @return    返回执行的状态
	 */
	public Integer executeSql(final String sql) {
		return this.getHibernateTemplate().execute(new HibernateCallback<Integer>() {
			@Override
			public Integer doInHibernate(Session session) throws HibernateException,SQLException {
				SQLQuery sqlQuery=session.createSQLQuery(sql);
				prepareQuery(sqlQuery);
				return sqlQuery.executeUpdate();
			}
		});
	}

}

 使用

 

DAO 接口:

 

public interface UserDao extends EntityDao<Admin>{

	Admin find(String userName);
	
	Admin find(String userName,String userPass);
	
}

 DAO的实现类:

 

public class UserDaoHibernate extends EntityDaoSupport<Admin> implements UserDao {
	
	public Admin find(String userName) {
		final String HQL="from Admin where userName=?";
		return super.find(HQL,userName);
	}
	
	public Admin find(String userName, String userPass) {
		final String HQL="from Admin where userName=? and userPass=?";
		return super.find(HQL,new String[]{userName,userPass});
	}
}
 

这样以来,则可以在实际开发时写DAO层就不要每次都去写5大方法了。但在Service层中是可以正确调用的这5大方法的。

注:HibernateDaoSupport 使用的是Spring3.0版本。

分享到:
评论

相关推荐

    一个通用的Hibernate DAO

    - **含义**:DAO是Data Access Object的缩写,数据访问对象,是一种常用的设计模式。在本例中,特指使用Hibernate框架实现的DAO。 - **作用**:表明本文档或代码主要关注的是基于Hibernate实现的DAO模式。 #### 四...

    自动生成DAO源代码

    首先,DAO是Data Access Object的缩写,它是业务逻辑层和持久化层之间的桥梁,负责处理与数据库的交互,如查询、插入、更新和删除等操作。DAO的设计目标是将数据访问逻辑与业务逻辑分离,使得系统更易于测试和维护。...

    hibernate3.0 jar包

    2. **数据访问对象(DAO)**:Hibernate提供了Session接口,它是DAO层的主要接口,用于执行CRUD(创建、读取、更新、删除)操作。例如,通过`Session.save()`方法可以将对象保存到数据库,`Session.get()`用于获取...

    JavaEE spring和Hibernate整合(没有hibernate.cfg.xml)

    "SSH"是Struts、Spring和Hibernate的缩写,代表了经典的JavaEE三层架构模型:表现层(Struts)、业务逻辑层(Spring)和数据访问层(Hibernate)。在这个场景中,我们将探讨如何在不使用`hibernate.cfg.xml`配置文件...

    Spring与Hibernate整合实例(博客用户登录增删改查)

    在IT行业中,SSH是一个常见的缩写,它代表了三个开源框架的组合:Spring、Struts和Hibernate。在这个“Spring与Hibernate整合实例(博客用户登录增删改查)”中,我们将探讨如何将这两个强大的框架——Spring和...

    Struts HIbernate Spring 增删改的实例

    此外,ADU可能代表了Action、DAO(Data Access Object)和User Interface的缩写,这通常表示在三层架构中的分工:Action负责业务逻辑,DAO处理数据访问,而User Interface则是用户交互的界面。在实际项目中,Struts...

    struts2+spring+hibernate示例

    3. **DAO层**:数据访问对象,用于与数据库进行交互,使用Hibernate API进行CRUD操作。 4. **Service层**:业务逻辑层,处理业务规则,调用DAO操作数据。 5. **Action层**:Struts2的Action类,接收并处理请求,调用...

    会员管理系统struts+hibernate+spring

    【文件名称】"Copy of S2SH"可能是指原项目名为S2SH的源代码文件,其中"S2SH"是Struts2、Spring和Hibernate的缩写。这个文件包含了整个项目的源码,包括但不限于控制器类、模型类、DAO(数据访问对象)层、服务层、...

    hibernate+spring+sturts项目案例(含jar包)

    SSH,即Spring、Struts和Hibernate的首字母缩写,是一种经典的Java Web开发框架组合,广泛应用于企业级应用系统开发。这个"hibernate+spring+sturts项目案例(含jar包)"提供了完整的SSH集成示例,对于初学者和有经验...

    SpringMVC+hibernate4+Spring4+mysql整合demo

    SSH是Spring、Struts和Hibernate三个开源框架的缩写,它们在Java Web开发中被广泛使用,构建了一个强大的MVC(Model-View-Controller)架构。在这个"SpringMVC+hibernate4+Spring4+mysql整合demo"中,我们将探讨如何...

    struts+hibernate的论坛

    在实际开发中,Struts负责处理用户请求,根据配置转发到相应的Action,Action再调用Hibernate的DAO进行数据操作。当操作完成后,Action将结果传递给JSP页面进行渲染,最终展示给用户。整个过程体现了MVC设计模式的...

    基于spring、hibernate、spring mvc的汽车管理系统demo

    SSH是Spring、Struts和Hibernate三个框架的缩写,它们共同构成了一套强大的Java EE开发解决方案。在这个汽车管理系统中,Spring作为整体的框架协调者,Hibernate负责数据持久化,而Spring MVC则处理Web层的请求响应...

    ssh最新整合+验证码(struts2,hibernate3,spring2.5)

    SSH是三个开源Java框架的缩写,分别是Struts2、Hibernate3和Spring2.5,它们常被用于构建企业级的Web应用程序。SSH框架的整合提供了模型-视图-控制器(MVC)架构,持久层管理和依赖注入等功能,极大地提高了开发效率...

    struts Spring hibernate整合(含源码和数据库)

    Spring作为“胶水”层,管理所有bean的生命周期,包括Struts的Action和Hibernate的DAO,同时提供事务管理;Hibernate则负责数据持久化,通过配置文件和注解将Java对象与数据库表进行映射。 压缩包中的"RCHSSH"可能...

    Struts_Spring_Hibernate(1)实例

    文件名"shs"可能代表Struts、Spring、Hibernate的缩写,暗示了这个实例涵盖了这三者的核心内容。 在Struts中,控制器由Action类实现,处理用户请求并调用相应的服务层方法。通过配置struts.xml文件,我们可以定义...

    Hibernate配置源码

    【压缩包子文件的文件名称列表】"sprh"可能是项目源代码的简写,具体包含了论坛系统的各个组件,如实体类、配置文件、DAO、Service、Controller等,以及可能的测试代码和日志文件。通过分析这些源代码,可以深入理解...

    nut dao的hello world

    在 "DaoDemo" 这个文件名中,“Dao”是Data Access Object的缩写,常用于封装对数据库的操作,所以这个文件可能是nut dao的一个简单示例。 在创建 "Hello World" 应用时,我们通常会做以下几步: 1. **引入依赖**...

Global site tag (gtag.js) - Google Analytics