rainlife 发表于 2013-2-5 01:20:45

Spring与范型DAO类的结合

前一阵子发了一篇Hibernate官网上面的一个范型DAO类支持的笔记,只是这个DAO类是基于Hibernate的实现,最近在项目中也参考了这个实现,并且与Spring结合在一起,加入了Spring的HibernateDaoSupport支持。具体代码如下。
IGenericDAO接口,这个接口与前一个帖子是一致的:
public interface IGenericDAO〈T, ID extends Serializable〉 {// 通过ID检索对应的实体对象T findById(ID id, boolean lock);// 列出所有的实体对象List〈T〉 findAll();// 通过Example方法检索实体对象List〈T〉 findByExample(T exampleInstance);// 产生持久化一个实体对象T makePersistent(T entity);// 产生一个游离对象void makeTransient(T entity);}
下面是针对IGenericDAO的实现,该类继承自Spring的HibernateDaoSupport,代码如下:
public abstract class GenericDAOHibernate〈T, ID extends Serializable, DAOImpl extends IGenericDAO〈T, ID〉〉extends HibernateDaoSupport implements IGenericDAO〈T, ID〉 {private Class〈T〉 persistentClass;public GenericDAOHibernate() {this.persistentClass = (Class〈T〉) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments();}public Class〈T〉 getPersistentClass() {return persistentClass;}@SuppressWarnings("unchecked")public T findById(ID id) {return (T) getHibernateTemplate().load(getPersistentClass(), id);}@SuppressWarnings("unchecked")public T findById(ID id, boolean lock) {T entity;if (lock)entity = (T) getHibernateTemplate().load(getPersistentClass(), id,LockMode.UPGRADE);elseentity = findById(id);return entity;}public List〈T〉 findAll() {return findByCriteria();}@SuppressWarnings("unchecked")public List〈T〉 findByExample(T exampleInstance) {DetachedCriteria detachedCrit = DetachedCriteria.forClass(getPersistentClass());Example example = Example.create(exampleInstance);detachedCrit.add(example);return getHibernateTemplate().findByCriteria(detachedCrit);}@SuppressWarnings("unchecked")public List〈T〉 findByExample(T exampleInstance, String[] excludeProperty) {DetachedCriteria detachedCrit = DetachedCriteria.forClass(getPersistentClass());Example example = Example.create(exampleInstance);for (String exclude : excludeProperty) {example.excludeProperty(exclude);}detachedCrit.add(example);return getHibernateTemplate().findByCriteria(detachedCrit);}public T makePersistent(T entity) {getHibernateTemplate().saveOrUpdate(entity);return entity;}public void makeTransient(T entity) {getHibernateTemplate().delete(entity);}@SuppressWarnings("unchecked")protected List〈T〉 findByCriteria(Criterion... criterion) {DetachedCriteria detachedCrit = DetachedCriteria.forClass(getPersistentClass());for (Criterion c : criterion) {detachedCrit.add(c);}return getHibernateTemplate().findByCriteria(detachedCrit);}}
实际上这个GenericDAOHibernate类还是比较简单的,主要通过Spring的getHibernateTemplate()方法来实现通用的CRUD操作。
在上一个帖子中有朋友问到,使用了范型的DAO类后,如何通过Spring来注入这个DAO类,实际上,注入DAO类与不使用范型是一样的,比如说对于上一个帖子的UserDAOHibernate的注入:
<bean id="userDao"class="org.rainlife.dao.hibernate.UserDaoHibernate"autowire="byName"/>
这样就完成了对userDAO的注入。
页: [1]
查看完整版本: Spring与范型DAO类的结合