Spring整合hibernate(4)之BaseDao的编写示例
Spring集成hibernate3和4有一定的区别,目前基本都在使用3,所以此处内容以3为基础;
说明:因为我们在实际编码中会编写一些重复的数据库操作方法CRUD,每个类都写一次感觉很繁琐,
因此可以考虑考虑把所有公共的方法都写在BaseDao中,这个时候,让所有的DAO都继承BaseDao;
这样基本上就实现了大量的基础方法,如果DAO中又一些特殊方法,再再具体的实现类的DAO中创建。
BaseDao设计流程图:
此处需要用到Class的对象来获取泛型的class,具体代码:
/** * 创建一个Class的对象来获取泛型的class */ private Class<T> clz; @SuppressWarnings("unchecked") public Class<T> getClz(){ if (clz==null) { clz=(Class<T>)(((ParameterizedType)this.getClass().getGenericSuperclass()).getActualTypeArguments()[0]); } return clz; }
在Spring整合hibernate(3)之基于HibernateDaoSupport的整合的基础上,具体实现关键代码:
IBaseDao类
<span style="font-family:FangSong_GB2312;font-size:14px;">package org.oms.spring.dao; import java.util.List; public interface IBaseDao<T> { public void add(T t); public void delete(int id); public void uodate(T t); public T load(int id); public List<T> list(String hql, Object[] args); } </span>
<span style="font-family:FangSong_GB2312;font-size:14px;">package org.oms.spring.dao; import java.lang.reflect.ParameterizedType; import java.util.List; import javax.annotation.Resource; import org.hibernate.Query; import org.hibernate.SessionFactory; import org.springframework.orm.hibernate3.support.HibernateDaoSupport; /** * 父类的setSessionFactory是 final 型的,所以我们不能override此方法 * 因此需要修改方法名称,此处使用setSuperSessionFactory() * 可以考虑考虑把所有公共的方法都写在BaseDao中,这个时候,让所有的DAO都继承BaseDao; * 这样基本上就实现了大量的基础方法,如果DAO中又一些特殊方法,再再具体的实现类的DAO中创建。 * @author sunlight * */ public class BaseDao<T> extends HibernateDaoSupport implements IBaseDao<T>{ @Resource(name="sessionFactory") public void setSuperSessionFactory(SessionFactory sessionFactory) { super.setSessionFactory(sessionFactory); } /** * 创建一个Class的对象来获取泛型的class */ private Class<T> clz; @SuppressWarnings("unchecked") public Class<T> getClz(){ if (clz==null) { clz=(Class<T>)(((ParameterizedType)this.getClass().getGenericSuperclass()).getActualTypeArguments()[0]); } return clz; } @Override public void add(T t) { this.getHibernateTemplate().save(t); } @Override public void delete(int id) { this.getHibernateTemplate().delete(this.load(id)); } @Override public void uodate(T t) { this.getHibernateTemplate().update(t); } @Override public T load(int id) { return this.getHibernateTemplate().load(getClz(), id); } @SuppressWarnings("unchecked") @Override public List<T> list(String hql, Object[] args) { @SuppressWarnings("deprecation") Query query=this.getSession().createQuery(hql); for (int i = 0; i < args.length; i++) { query.setParameter(i, args[i]); } List<T> list=query.list(); return list; } } </span>
<span style="font-family:FangSong_GB2312;font-size:14px;">package org.oms.spring.dao; import org.oms.spring.model.User; public interface IUserDao extends IBaseDao<User> { //此方法为特殊方法,因此单独编写 public void add(User user,int gid); } </span>
<span style="font-family:FangSong_GB2312;font-size:14px;">package org.oms.spring.dao; import javax.annotation.Resource; import org.oms.spring.model.Group; import org.oms.spring.model.User; import org.springframework.stereotype.Repository; /** * User基于Hibernate的CRUD * @author sunlight * */ @Repository("userHibernateDao") public class UserHibernateDao extends BaseDao<User> implements IUserDao { private IGroupDao groupHibernateDao; public IGroupDao getGroupHibernateDao() { return this.groupHibernateDao; } @Resource public void setGroupHibernateDao(IGroupDao groupHibernateDao) { this.groupHibernateDao = groupHibernateDao; } @Override public void add(User user, int gid) { Group group=groupHibernateDao.load(gid); user.setGroup(group); this.add(user); //this.getHibernateTemplate().save(user); } } </span>
<span style="font-family:FangSong_GB2312;font-size:14px;">package org.oms.spring.dao; import org.oms.spring.model.Group; public interface IGroupDao extends IBaseDao<Group>{ } </span>
<span style="font-family:FangSong_GB2312;font-size:14px;">package org.oms.spring.dao; import org.oms.spring.model.Group; import org.springframework.stereotype.Repository; /** * Group基于Hibernate的CRUD * @author sunlight * */ @Repository("groupHibernateDao") public class GroupHibernateDao extends BaseDao<Group> implements IGroupDao { } </span>
源码下载地址:http://download.csdn.net/detail/rzg813/8030109
个人备忘笔记,呵呵~~!