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