一般的DAO都有CRUD操作,在每个实体DAO接口中重复定义这些方法,不如提供一个通用的DAO接口,具体的实体DAO可以扩展这个通用DAO以提供特殊的操作,从而将DAO抽象到另一层次,令代码质量有很好的提升
1.通用接口
- import java.io.Serializable;
- import java.util.List;
- public interface BaseDao<T> {
- T get(Serializable id);
- List<T> getAll();
- // List<T> find(String hql,);
- void save(Object o);
- void remove(Object o);
- void update(Object o);
- }
2.DAO基类
- import java.io.Serializable;
- import java.lang.reflect.ParameterizedType;
- import java.lang.reflect.Type;
- import java.util.List;
- import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
- public class HibernateBaseDao<T> extends HibernateDaoSupport implements BaseDao<T>{
- private Class<T> entityClass;
- public HibernateBaseDao() {
- Type genType = getClass().getGenericSuperclass();
- Type[] params = ((ParameterizedType) genType).getActualTypeArguments();
- entityClass = (Class)params[0];
- }
- public T get(Serializable id) {
- return (T)getHibernateTemplate().load(entityClass, id);
- }
- public List<T> getAll() {
- return getHibernateTemplate().loadAll(entityClass);
- }
- public void save(Object o) {
- getHibernateTemplate().saveOrUpdate(o);
- }
- public void remove(Object o) {
- getHibernateTemplate().delete(o);
- }
- public void update(Object o) {
- getHibernateTemplate().update(o);
- }
- }
这里利用反射机制获取泛型对应的实体类的类型
3.实体DAO类
- import java.util.Iterator;
- import java.util.List;
- import com.baobaotao.dao.ForumDao;
- import com.baobaotao.dao.HibernateBaseDao;
- import com.baobaotao.domain.Forum;
- public class ForumHibernateDao2 extends HibernateBaseDao<Forum> implements ForumDao{
- public long getForumNum() {
- Iterator iter = getHibernateTemplate().iterate(
- "select count(f.forumId) from Forum f");
- return ((Long)iter.next());
- }
- }
通过扩展泛型DAO基类,就自动拥有基类的数据操作功能,只要提供特殊的功能即可,实体DAO的编码生产率得到了极大的提高