目錄
業務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組件
}
}