SHH中的BaseDao(增删改查操作)

抽取BaseDao

将Dao中可能遇到的增删改查方法抽取出来封装到类中。这样Dao只需要继承BaseDao就可以拥有增删改查功能。体现面向切面编程,减少代码量。

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

猜你喜欢

转载自blog.csdn.net/hytxwz/article/details/80466271