Spring与范型DAO类的结合
前一阵子发了一篇Hibernate官网上面的一个范型DAO类支持的笔记,只是这个DAO类是基于Hibernate的实现,最近在项目中也参考了这个 实现,并且与Spring结合在一起,加入了Spring的HibernateDaoSupport支持。具体代码如下。
IGenericDAO接口,这个接口与前一个帖子是一致的:
下面是针对IGenericDAO的实现,该类继承自Spring的HibernateDaoSupport,代码如下:
实际上这个GenericDAOHibernate类还是比较简单的,主要通过Spring的getHibernateTemplate()方法来实现通用的CRUD操作。
在上一个帖子中有朋友问到,使用了范型的DAO类后,如何通过Spring来注入这个DAO类,实际上,注入DAO类与不使用范型是一样的,比如说对于上一个帖子的UserDAOHibernate的注入:
这样就完成了对userDAO的注入。
IGenericDAO接口,这个接口与前一个帖子是一致的:
Java代码
- 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,代码如下:
Java代码
- 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()[0];
- }
- 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);
- else
- entity = 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的注入:
Java代码
- <bean id="userDao"
- class="org.rainlife.dao.hibernate.UserDaoHibernate"
- autowire="byName"/>
这样就完成了对userDAO的注入。