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版本。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值