抽取BaseDao
将Dao中可能遇到的增删改查方法抽取出来封装到类中。这样Dao只需要继承BaseDao就可以拥有增删改查功能。体现面向切面编程,减少代码量。
BaseDao的设计思路
具体实现
BaseDao接口书写
//Dao类父接口,封装了增删改查方法
//为了方便方便所有Dao继承使用泛型
public interface BaseDao<T> {
//增
void save(T t);
//通过对象删除
void delete(T t);
//通过Id删除 -- 因为id的类型(八大基本类型+String)一定是serializable的实现类所以使用serializable
void delete(Serializable id);
//改
void update(T t);
//通过Id查询
T getById(Serializable id);
//查询符合条件的总记录数
Integer getTotalCount(DetachedCriteria dc);
//查询分页列表数据
List<T> getPageList(DetachedCriteria dc, Integer start, Integer end);
}
BaseDao的实现类
//BaseDao的具体实现类
//因为这里还是不知道泛型的具体类型所以这里也加上泛型
public class BaseDaoImpl<T> extends HibernateDaoSupport implements BaseDao<T> {
//通过hibernateTemplate来操作数据库
private Class clz; //用来接收当前运行类的泛型
public BaseDaoImpl() {
/*this.getClass().getGenericSuperclass()可以获得当前类型的带有泛型类型的父类(反射)
结合原理图来看当前运行类为customerDaoImpl,父类即BaseDaoImpl
返回值为type类型,用一个实现类ParameterizedType来接收*/
ParameterizedType ptClass = (ParameterizedType) this.getClass().getGenericSuperclass();
//getActualTypeArguments()获得运行期的泛型类型字节码对象数组
clz = (Class) ptClass.getActualTypeArguments()[0];
}
@Override
public void save(T t) {
super.getHibernateTemplate().save(t);
}
@Override
public void delete(T t) {
super.getHibernateTemplate().delete(t);
}
@Override
public void delete(Serializable id) {
T t = this.getById(id);
this.delete(t);
}
@Override
public void update(T t) {
super.getHibernateTemplate().update(t);
}
@Override
public T getById(Serializable id) {
//这里需要运行期类的泛型的字节码对象
return (T) super.getHibernateTemplate().get(clz, id);
}
@Override
public Integer getTotalCount(DetachedCriteria dc) {
//设置查询的聚合函数,总记录数
dc.setProjection(Projections.rowCount());
List<Long> list = (List<Long>) getHibernateTemplate().findByCriteria(dc);
//清空之前设置的聚合函数,避免其他函数调用dc查询数据库时出现问题
dc.setProjection(null);
if(list!=null && list.size()>0){
Long count = list.get(0);
return count.intValue();
}else{
return null;
}
}
@Override
public List<T> getPageList(DetachedCriteria dc, Integer start, Integer end) {
List<T> list = (List<T>) super.getHibernateTemplate().findByCriteria(dc, start, end);
return list;
}
}
业务Dao中的应用
Dao实现类不需要继承hibernateDaoSupport而是直接继承BaseDaoImpl(继承了hibernateDaoSupport)。这样就可以直接使用BaseDaoImpl中的增删改查方法。
@Repository("userDao")
public class UserDaoImpl extends BaseDaoImpl<User> implements UserDao {
技术交流:713788313