Dao接口
public interface BaseDao {
//新增
public void save(T entity);
//更新
public void update(T entity);
//删除
public void delete(Serializable id);
//根据id查询
public T findObjectById(Serializable id);
//查询列表
public List findObjects();
}
Dao实现
public abstract class BaseDaoImpl extends HibernateDaoSupport implements BaseDao {
Class clazz;
/**
* 获取真实的泛型类型
*/
public BaseDaoImpl(){
// 获取当前new的对象的 泛型的父类 类型
ParameterizedType pt = (ParameterizedType)this.getClass().getGenericSuperclass();//BaseDaoImpl
clazz = (Class)pt.getActualTypeArguments()[0];// 获取第一个类型参数的真实类型
}
@Override
public void save(T entity) {
getHibernateTemplate().save(entity);
}
@Override
public void update(T entity) {
getHibernateTemplate().update(entity);
}
@Override
public void delete(Serializable id) {
getHibernateTemplate().delete(findObjectById(id));
}
@Override
public T findObjectById(Serializable id) {
return getHibernateTemplate().get(clazz, id);
}
@Override
public List findObjects() {
return getCurrentSession().createQuery("FROM " + clazz.getSimpleName()).list();
}
@Override
public List findObjects(String hql, List parameters) {
Query query = getCurrentSession().createQuery(hql);
if(parameters != null){
for(int i = 0; i < parameters.size(); i++){
query.setParameter(i, parameters.get(i));
}
}
return query.list();
}
}
基础Dao的采用的是java的反射技术,在基础Dao中获取子类真实的泛型父类,从而达到通用的目的。
基础Service接口
public abstract class BaseServiceImpl implements BaseService {
private BaseDao baseDao;
public void setBaseDao(BaseDao baseDao) {
this.baseDao = baseDao;
}
@Override
public void save(T entity) {
baseDao.save(entity);
}
@Override
public void update(T entity) {
baseDao.update(entity);
}
@Override
public void delete(Serializable id) {
baseDao.delete(id);
}
@Override
public T findObjectById(Serializable id) {
return baseDao.findObjectById(id);
}
@Override
public List findObjects() {
return baseDao.findObjects();
}
}
基础Service简易实现方式
@Service("userService")
public class UserServiceImpl extends BaseServiceImpl implements UserService {
private UserDao userDao;
@Resource
public void setUserDao(UserDao userDao) {
super.setBaseDao(userDao);
this.userDao = userDao;
}
} 使用set方法注入UserDao时,也将子类的Dao实现类对象传递给了BaseDao。