抽取BaseDao和BaseService

目錄

抽取BaseDao

定義BaseDao接口

定義BaseDaoImpl類

業務Dao基於BaseDao的的實現方式

抽取BaseService

定義BaseService接口

定義抽象的BaseServiceImpl類

業務service基於BaseService的實現(第一種方式):

業務service基於BaseService的實現(第二種方式):


抽取BaseDao

               結構關係如下:

                

定義BaseDao接口

public interface IBaseDao<T> {

    //增
    public void save(T entity);

    //刪
    public void delete(T entity);

    //改
    public void update(T entity);

    // 通過ID來查
    public T find(Serializable id);

    //查詢表的所有數據
    public List<T> findAll();

}

定義BaseDaoImpl類

這個實現類的作用重大:注入hibernateTemplate,實現泛型到真實類的轉換

public class BaseDaoImpl<T> implements IBaseDao<T>{

    private Class<T> entityClass;
    public BaseDaoImpl(){
        //獲取泛型的真實類型    
        ParameterizedType pt = (ParameterizedType) this.getClass().getGenericSuperclass();

        //獲取泛型真實類型
        Type[] types = pt.getActualTypeArguments();

        //把type類型賦值給Class類型
        entityClass = (Class<T>) types[0];
       
    }
    @Autowired 
    private HibernateTemplate hibernateTemplate;

    @Override
    public void save(T entity) {
        this.hibernateTemplate.save(entity);
    }

    @Override
    public void delete(T entity) {
        this.hibernateTemplate.delete(entity);
    }

    @Override
    public void update(T entity) {

        this.hibernateTemplate.update(entity);
    }

    @Override
    public T find(Serializable id) {
        return this.hibernateTemplate.get(entityClass,id);
    }

    @Override
    public List<T> findAll() { 
        String hql = "from " + entityClass.getSimpleName();
        return this.hibernateTemplate.find(hql);
    }
}

到此BaseDao的抽取完成

業務Dao基於BaseDao的的實現方式

自定義的的dao接口要繼承BaseDao接口,這樣在繼承了BaseDao接口的方法後,自定義的接口內還可以定義自己特有的方法。

自定義接口的實現類要繼承BaseDaoImpl實現類,同時實現自己的接口。這樣繼承了BaseDaoImpl類實現的方法和操作數據庫的template,同時可以實現自己接口定義的方法。

UserDao接口:

public interface IUserDao extends IBaseDao<User> {

    public User findByEmail(String email);

}

UserDaoImpl實現類:

@Repository
public class UserDaoImpl extends BaseDaoImpl<User> implements IUserDao{
    @Override
    public User findByEmail(String email) {
        return null;
    }
}

 

抽取BaseService

service抽取的原理與dao的類似,但是不同的是service裏要注入的是不同的業務Dao,是不固定的。所以在BaseServiceImpl類上有一些不同,有兩種實現方式:

1.BaseServiceImpl實現類定義爲抽象類,業務service實現類繼承該類以便實現BaseService接口的方法當有多個service需要用到相同dao的時候可以通過這個抽象類注入dao這種實現方式下,業務的service實現類裏要顯示的實現並重寫BaseService接口的方法。

2.與Dao抽取一樣使用泛型,但是自定義的service實現類裏要主動注入自己的Dao組件,並通過調用父類(BaseServiceImpl)BaseDao成員的SetBaseDao()方法通過將Dao組件傳到父類中。這種實現方式下,業務的service實現類裏不需要要顯示的實現BaseService接口的方法。

定義BaseService接口

public interface IBaseService<T> {
    public void save(T entity);
    public void delete(T entity);
    public void update(T entity);
    public T find(Serializable id);
    public List<T> findAll();
}

定義抽象的BaseServiceImpl類

public abstract class BaseServiceImpl<T> implements IBaseService<T> {

       

}

業務service基於BaseService的實現(第一種方式):

定義UserService接口:

public interface IUserService extends IBaseService<User>{

    //特有的業務方法
    public User findByTel(String tel);
}

定義UserServiceImpl實現類:

與業務Dao實現類的區別是,這裏需要的dao成員變量要自己注入,而且由於公共service的實現類是抽象的所以這裏自定義的

@Service
@Transactional
public class UserServiceImpl extends BaseServiceImpl<User> implements IUserService {

    @Autowired
    private IUserDao userDao;

    @Override
    public User findByTel(String tel) {
        return null;
    }

    @Override
    public void save(User entity) {

        userDao.save(entity);
    }

    @Override
    public void delete(User entity) {
        userDao.delete(entity);
    }

    @Override
    public void update(User entity) {
        userDao.update(entity);
    }

    @Override
    public User find(Serializable id) {
        return userDao.find(id);
    }

    @Override
    public List<User> findAll() {
        return userDao.findAll();
    }
}

業務service基於BaseService的實現(第二種方式):

BaseServiceImpl類注入BaseDao,實現接口的方法

public  class BaseServiceImpl<T> implements IBaseService<T> {

       private BaseDao<T> baseDao;
    public void setBaseDao(BaseDao<T> baseDao) {
        this.baseDao = baseDao;
    }
 
    public void save(T entity) {
        baseDao.save(entity);
    }
    public void delete(T entity) {
        baseDao.delete(entity);
    }
    public void update(T entity) {
        baseDao.update(entity);
    }
    public T findById(Serializable id) {
        return baseDao.findById(id);
    }
    public List<T> getAll() {
        return baseDao.getAll();
    }
 


}

業務service的實現類不需要再顯示實現BaseService接口的方法了 

@Service
@Transactional
public class UserServiceImpl extends BaseServiceImpl<User> implements IUserService {

    @Autowired
    private IUserDao userDao;

    @Resources
   @Resource
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
        super.setBaseDao(userDao);//主動注入Dao組件
    }

   
}

 

發佈了137 篇原創文章 · 獲贊 36 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章