通过泛型实现持久层 BaseDao 的写法

原创 2016年05月06日 17:46:06

通过泛型实现持久层 BaseDao 的写法

问题说明:我们在编写 Dao 层的时候,总会遇到通用的增删改查方法,每一次都要写声明和实现是一件很繁琐的事情,而且代码有很多事相同点。于是我们想到了使用面向对象的三大特性和泛型语法来简化持久层的开发。

Base 的实现类和接口都是抽象的,所以都带泛型。

第 1 步:编写 BaseDao 接口 IBaseDao

注意泛型。

public interface IBaseDao<T> {
    public void add(T t);
    public void delete(Integer id);
    public void update(T t);
    public T load(Integer id);
    public T get(Integer id);
    public List<T> list(String hql, Object[] params);
}

说明:这个接口是一个高度抽象的接口。每个实体类都会有这样的方法。
既然有基本接口类,那么就会有基本实现类。

第 2 步:编写基本实现类 BaseDao

说明:下面的代码中继承 HibernateDaoSupport 非必需,根据我们选择不同的持久层框架而定,例子中的代码选择的是 Hibernate 持久层框架。

/**
 * Created by Liwei on 2016/5/6.
 */
public class BaseDao<T> extends HibernateDaoSupport implements IBaseDao<T>{

    @Resource(name = "sessionFactory")
    public void setSuperSessionFactory(SessionFactory sessionFactory) {
        super.setSessionFactory(sessionFactory);

    }

    public void add(T t) {
        getHibernateTemplate().save(t);
    }

    public void delete(Integer id) {
        getHibernateTemplate().delete(this.load(id));
    }

    public void update(T t) {
        getHibernateTemplate().update(t);
    }

    /**
     * 创建一个 Class 的对象来获取泛型的 Class
     */
    private Class<T> clz;


    public Class<T> getClz(){
        if(clz==null){
            clz = ((Class<T>)(((ParameterizedType)(this.getClass().getGenericSuperclass())).getActualTypeArguments()[0]));
        }
        return clz;
    }


    /**
     *
     * @param id
     * @return
     */
    public T load(Integer id) {
        return getHibernateTemplate().load(getClz(),id);
    }

    public T get(Integer id) {
        return getHibernateTemplate().get(getClz(),id);
    }

    /**
     *
     * @param hql
     * @param params
     * @return
     */
    @SuppressWarnings("unchecked")
    public List<T> list(String hql, Object[] params) {
        Query query = this.getSession().createQuery(hql);
        for(int i=0;i>params.length;i++){
            query.setParameter(i,params[i]);

        }
        List<T> list = query.list();
        return list;
    }
}

第 3 步:编写具体接口

关键点:接口继承接口,但被继承的接口应该写上实现类了。

public interface IUserDao extends IBaseDao<User> {

    public void add(User user, Integer groupid);
}

第 4 步:编写实现类

@Repository
public class UserHibernateDao extends BaseDao<User> implements IUserDao{

    private IGroupDao groupHibernateDao;

    public IGroupDao getGroupHibernateDao() {
        return groupHibernateDao;
    }

    @Autowired
    public void setGroupHibernateDao(IGroupDao groupHibernateDao) {
        this.groupHibernateDao = groupHibernateDao;
    }

    public void add(User user, Integer groupid) {
        Group group = groupHibernateDao.load(groupid);
        user.setGroup(group);
        this.getHibernateTemplate().save(user);
    }
}

JAVA 泛型BaseDao<T> BaseService <T>

model 层 package com.maomao.model; import java.io.Serializable; public class User implements Seria...
  • a275109112
  • a275109112
  • 2015年07月31日 15:30
  • 25512

封装的泛型BaseDao

  • 2011年05月23日 23:45
  • 5KB
  • 下载

BaseDao<T> CRUD 泛型支持

package top.ybchina.base.exception;import java.io.Serializable; import java.lang.reflect.Parameteriz...
  • Mrzhang__
  • Mrzhang__
  • 2016年11月19日 15:50
  • 757

java泛型详解和反射泛型通用BaseDao实现

一 泛型的基本概念 1.1什么是泛型? 泛型,即“参数化类型”。一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。那么参数化类型怎么理解呢?顾名思义,就是将类型由原来的具体的类型...
  • nwpu_geeker
  • nwpu_geeker
  • 2017年12月05日 21:54
  • 203

BaseDAO开发及获取泛型的传输数据类型(Class<T>)实例讲解

一般在涉及DAO开发时,常用到的增删改查方法会封装到一个基类(BaseDAO),对于各个数据表的基本维护业务都需要用到增删改查等方法。 若对每张表都编写一套增删改差方法未必有些麻烦,并且不符合编码的基...
  • hjd1622
  • hjd1622
  • 2016年05月17日 15:04
  • 1571

spring data jpa 定义全局接口BaseDao

好,现在我要搭一个项目,我想定义一个BaseDao,然后直接让其他模块的dao直接继承我这个BaseDao,BaseDao有通用的方法也有spring data jpa提供的便捷方法那就新建一个Bas...
  • yingxiake
  • yingxiake
  • 2016年03月30日 18:08
  • 5272

BaseDao基于JPA的实现

一,说明 基本DAO的实现也是基于上一篇文章,Spring3+Hibernate4+JPA2.0整合之后,DAO层的实现 二,DAO层的功能       这里要简单提一下MVC模式了,MVC本身...
  • zzj806683450
  • zzj806683450
  • 2015年03月17日 14:41
  • 4572

JPA通用Dao类设计

设计思路:利用spring对dao层的支持,使用泛行方式对它进行一次包装,此通用DAO只实现最基本的增删改查功能,具体的特殊实现有它的子类实现 接口设计,在原来的工程中建立一个源代码包,名称为c...
  • menghuannvxia
  • menghuannvxia
  • 2015年11月23日 20:59
  • 1745

JPA 应用篇(一) 基于JPA 的BaseDAO

basedao
  • zgf19930504
  • zgf19930504
  • 2015年11月06日 13:05
  • 459

BaseDao基于JPA的实现

一,说明 基本DAO的实现也是基于上一篇文章,Spring3+Hibernate4+JPA2.0整合之后,DAO层的实现 二,DAO层的功能       这里要简单提一下MVC模式了,MVC本身不是一...
  • wei763328075qq
  • wei763328075qq
  • 2015年12月14日 10:33
  • 372
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:通过泛型实现持久层 BaseDao 的写法
举报原因:
原因补充:

(最多只允许输入30个字)