数据库访问时一般采用分层模型,其中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的基础上根据需要扩展就可以了。