通过反射和泛型实现DAO层的基类

数据库访问时一般采用分层模型,其中dao层的在实现时,对每个不同的model所写的代码基本相同,只是所访问的entity类不同。如果能够采用泛型的思想实现一个dao的基类,具体的entity访问dao只需要继承该基类就可以避免重复写大量相同的代码。

代码如下:

 1 public class BaseDao<T> {
 2     private Class<T> entityClass;
 3     @Autowired
 4     private HibernateTemplate hibernateTemplate;
 5 
 6 
 7     public BaseDao(){
 8         Type genType = getClass().getGenericSuperclass();//通过反射获取当前类表示的实体(类,接口,基本类型或void)的直接父类的Type
 9         Type[] params = ((ParameterizedType)genType).getActualTypeArguments();//返回参数数组
10         entityClass=(Class)params[0];
11     }
12     //根据ID加载PO实例
13     public T load(Serializable id){
14         return (T)getHibernateTemplate().load(entityClass,id);
15     }
16     //根据ID获取PO实例
17     public T get(Serializable id){
18         return (T)getHibernateTemplate().get(entityClass,id);
19     }
20     //获取PO的所有对象
21     public List<T> loadAll(){
22         return getHibernateTemplate().loadAll(entityClass);
23     }
24 
25     public void save(T entity){
26         getHibernateTemplate().save(entity);
27     }
28 
29     public void remove(T entity){
30         getHibernateTemplate().delete(entity);
31     }
32 
33     public void update(T entity){
34         getHibernateTemplate().update(entity);
35     }
36 
37     public List find(String hql){
38         return getHibernateTemplate().find(hql);
39     }
40     //执行带参数的HQL查询
41     public List find(String hql,Object... params){
42         return getHibernateTemplate().find(hql,params);
43     }
44     //对延迟加载的实体PO执行初始化
45     public void initialize(Object entity){
46         getHibernateTemplate().initialize(entity);
47     }
48 
49     public HibernateTemplate getHibernateTemplate(){
50         return hibernateTemplate;
51     }
52 }

如果有一个UserDao,UserDao只需要继承BaseDao就可以很简单的实现。

代码如下:

public class UserDao extends BaseDao {
    public void AddUser(UserEntity userEntity){
        getHibernateTemplate().save(userEntity);
    }
    public void updateUser(UserEntity userEntity){
        getHibernateTemplate().update(userEntity);
    }
    public void deleteUser(UserEntity userEntity){
        getHibernateTemplate().delete(userEntity);
    }
    public List<UserEntity> findUserByName(String username){
        String hql = "from UserEntity u where u.username like ?";
        String name = "%"+username+"%";
        return (List<UserEntity>)getHibernateTemplate().find(hql,name);
    }
}

 至于其他的dao只需要在BaseDao的基础上根据需要扩展就可以了。

posted @ 2014-04-20 11:14  blackcat_333  阅读(917)  评论(1编辑  收藏  举报