基于HibernateDaoSupport的泛型DAO

 

基于HibernateDaoSupport的泛型DAO

基于HibernateDaoSupport的泛型类DAO


泛型是java SE 1.5的新特性,泛型本质上是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以在类、接口和方法中创建,分别称为泛型类、泛型接口和泛型方法。
Java语言引入泛型的好处是安全简单。泛型的优点在于编译时检查类型安全,并且所有的强制转换都是自动和隐式的,提高代码的重用率。
泛型在使用过程中需要遵循一些规则以及泛型的限制条件:
1、泛型的类型参数只能是类类型(包含自定义类),不能是简单类型。
2、同一种泛型可以对应多个版本(因为参数类型是不确定的),不同版本的泛型类实例是不兼容的。
3、泛型的类型参数可以有多个。
4、泛型的参数类型可以使用extends语句,例如<T extends superclass>。习惯上称为“有界类型”。
5、泛型的参数类型还可以是通配符。例如Class<?>classType = Class.forName(java.lang.String);
泛型也存在自身的一些缺点,每次定义是都要写明泛型的类型,代码量加大。如果你的项目不是完全按照面向接口编程,那么不用泛型也没有问题,如果代码是面向接口编程,泛型将有助于帮助你在编译时就把错误找出来。

#1 通用DAO接口定义:
public interface GeneralHibernateDao<T,ID extends Serializable> {

/**
* 保存实体
* @param entity
*/
public void save(T entity);
/**
* 删除实体
* @param entity
*/
public void delete(T entity);

/**
* 获取所有实体集合
* @param entityClass
* @return
*/
public List<T> findAll(Class<T> entityClass);

/**
* 保存或更新实体
* @param entity
*/
public void saveOrUpdate(T entity);

/**
* 查找指定ID实体对象
* @param entityClass
* @param id
* @return
*/
public T findById(Class<T> entityClass,ID id);

/**
* 查询指定HQL语句,并返回集合
* @param hql 指定的HQL语句
* @param values 可变参数集合
* @return
*/
public List<Object> find(String hql,Object...values);

/**
* 按照HQL语句查询唯一对象
* @param hql HQL语句
* @param values 可变参数集合
* @return Object对象
*/
public Object findUnique(final String hql,final Object...values);

/**
* 查找指定HQL并返回int型
* @param hql hql语句
* @param values 可变参数集合
* @return int类型
*/
public int findInt(final String hql,final Object...values);

/**
* 获取指定实体Class指定条件记录总数
* @param entityClass 实体Class
* @param where HQL查询条件,支持参数列表
* @param values 可变参数列表
* @return 记录总数
*/
public int findTotalCount(Class<T> entityClass,final String where,final Object...values);

/**
* 获取指定实体Class的记录总数
* @param entityClass 实体Class
* @return 记录总数
*/
public int findTotalCount(Class<T> entityClass);

/**
* 查找指定属性的实体集合
* @param entityClass 实体Class
* @param propertyName 属性名
* @param value 条件
* @return 实体集合
*/
public List<T> findByPropertiy(Class<T> entityClass,String propertyName,Object value);

/**
* 分页查询
* @param entityClass
* @param hql
* @param start
* @param pagesize
* @param values
* @return
*/
public List<T> findByPage(final Class<T> entityClass,final String hql,final int start,final int pagesize,final Object...values);

/**
* 根据查询条件与参数列表创建Query对象
* @param session
* @param hql
* @param values
* @return
*/
public Query createQuery(Session session,String hql,Object...values);

}

#2 通用DAO的实现类

public class GeneralHibernateDaoImpl<T,ID extends Serializable> extends HibernateDaoSupport implements GeneralHibernateDao<T, ID>{

private Class<T> entityClass;

@SuppressWarnings("unchecked")
public GeneralHibernateDaoImpl() {
this.entityClass = null;
@SuppressWarnings("rawtypes")
Class c = getClass();
Type type = c.getGenericSuperclass();
if(type instanceof ParameterizedType){
Type[] types = ((ParameterizedType)type).getActualTypeArguments();
entityClass = (Class<T>)types[0];
}
}


/* (non-Javadoc)kj
* @see com.taoliyun.commons.generaldao.GeneralHibernateDao#save(java.lang.Object)
*/
@Override
public void save(T entity) {
try {
this.getHibernateTemplate().save(entity);
} catch (RuntimeException e) {
throw new TaoliyunException("保存实体异常"+entity.getClass().getName(),e);
}
}

/* (non-Javadoc)
* @see com.taoliyun.commons.generaldao.GeneralHibernateDao#delete(java.lang.Object)
*/
@Override
public void delete(T entity) {
try {
this.getHibernateTemplate().delete(entity);
} catch (RuntimeException e) {
throw new TaoliyunException("删除实体类:"+entity.getClass().getName()+"发生异常", e);
}
}

/* (non-Javadoc)
* @see com.taoliyun.commons.generaldao.GeneralHibernateDao#findAll(java.lang.Class)
*/
@SuppressWarnings("unchecked")
@Override
public List<T> findAll(Class<T> entityClass) {
try {
return this.getHibernateTemplate().find("from "+entityClass.getName());
} catch (RuntimeException e) {
throw new TaoliyunException("查找指定实体集合异常,实体"+entityClass.getName(), e);
}
}

/* (non-Javadoc)
* @see com.taoliyun.commons.generaldao.GeneralHibernateDao#saveOrUpdate(java.lang.Object)
*/
@Override
public void saveOrUpdate(T entity) {
try {
this.getHibernateTemplate().saveOrUpdate(entity);
} catch (RuntimeException e) {
throw new TaoliyunException("更新或保存实体:"+entity.getClass().getName()+"发生异常", e);
}
}

/* (non-Javadoc)
* @see com.taoliyun.commons.generaldao.GeneralHibernateDao#findById(java.lang.Class, java.io.Serializable)
*/
@Override
public T findById(Class<T> entityClass, ID id) {
try {
@SuppressWarnings("unchecked")
T t = (T)this.getHibernateTemplate().get(entityClass.getName(), id);
return t;
} catch (Exception e) {
throw new TaoliyunException("查找指定ID实体:"+entityClass.getName()+"异常", e);
}
}

/* (non-Javadoc)
* @see com.taoliyun.commons.generaldao.GeneralHibernateDao#find(java.lang.String, java.lang.Object[])
*/
@SuppressWarnings("unchecked")
@Override
public List<Object> find(String hql, Object... values) {
try {
return this.getHibernateTemplate().find(hql, values);
} catch (RuntimeException e) {
throw new TaoliyunException("查询指定HQL发生异常,HQL:"+hql,e);
}
}

/* (non-Javadoc)
* @see com.taoliyun.commons.generaldao.GeneralHibernateDao#findUnique(java.lang.String, java.lang.Object[])
*/
@Override
public Object findUnique(final String hql, final Object... values) {
try {
return this.getHibernateTemplate().execute(new HibernateCallback<Object>() {
@Override
public Object doInHibernate(Session session) throws HibernateException, SQLException {
Query query = createQuery(session, hql, values);
return query.uniqueResult();
}
});
} catch (DataAccessException e) {
throw new TaoliyunException("查询指定HQL异常,HQL:"+hql, e);
}
}

/* (non-Javadoc)
* @see com.taoliyun.commons.generaldao.GeneralHibernateDao#findInt(java.lang.String, java.lang.Object[])
*/
@Override
public int findInt(String hql, Object... values) {
try {
int num = 0;
Object obj = findUnique(hql, values);
if(obj!=null){
num = Integer.parseInt(String.valueOf(obj));
}
return num;
} catch (NumberFormatException e) {
throw new TaoliyunException("数据转换发生异常!", e);
}
}

/* (non-Javadoc)
* @see com.taoliyun.commons.generaldao.GeneralHibernateDao#findTotalCount(java.lang.Class, java.lang.String, java.lang.Object[])
*/
@Override
public int findTotalCount(Class<T> entityClass, String where, Object... values) {
String hql = "select count(e) from "+entityClass.getName()+" as e "+where;
return this.findInt(hql, values);
}

/* (non-Javadoc)
* @see com.taoliyun.commons.generaldao.GeneralHibernateDao#findTotalCount(java.lang.Class)
*/
@Override
public int findTotalCount(Class<T> entityClass) {
String hql = "select count(e) from "+entityClass.getName()+ " as e";
return this.findInt(hql,"");
}

/* (non-Javadoc)
* @see com.taoliyun.commons.generaldao.GeneralHibernateDao#findByPropertiy(java.lang.Class, java.lang.String, java.lang.Object)
*/
@SuppressWarnings("unchecked")
@Override
public List<T> findByPropertiy(Class<T> entityClass, String propertyName, Object value) {
try {
String hql = "from "+entityClass.getName()+" as model where model."+propertyName+"=?";
return this.getHibernateTemplate().find(hql, value);
} catch (RuntimeException e) {
throw new TaoliyunException("查找指定条件集合异常,条件:"+propertyName+"="+value, e);
}
}

/* (non-Javadoc)
* @see com.taoliyun.commons.generaldao.GeneralHibernateDao#findByPage(java.lang.Class, java.lang.String, int, int, java.lang.Object[])
*/
@Override
public List<T> findByPage(Class<T> entityClass, final String hql, final int start, final int pagesize, final Object... values) {
try {
return this.getHibernateTemplate().execute(new HibernateCallback<List<T>>() {
@SuppressWarnings("unchecked")
@Override
public List<T> doInHibernate(Session session) throws HibernateException, SQLException {
Query query = createQuery(session, hql, values);
query.setFirstResult(start);
query.setMaxResults(pagesize);
return query.list();
}
});
} catch (RuntimeException e) {
throw new TaoliyunException("查找指定HQL分页异常,HQL:"+hql, e);
}
}

/* (non-Javadoc)
* @see com.taoliyun.commons.generaldao.GeneralHibernateDao#createQuery(org.hibernate.Session, java.lang.String, java.lang.Object[])
*/
@Override
public Query createQuery(Session session, String hql, Object... values) {
Query query = session.createQuery(hql);
if(values!=null){
for(int i=0;i<values.length;i++){
query.setParameter(i, values[i]);
}
}
return query;
}

}