Spring整合hibernate(4)之BaseDao的编写示例
Spring集成hibernate3和4有一定的区别,目前基本都在使用3,所以此处内容以3为基础;
说明:因为我们在实际编码中会编写一些重复的数据库操作方法CRUD,每个类都写一次感觉很繁琐,
因此可以考虑考虑把所有公共的方法都写在BaseDao中,这个时候,让所有的DAO都继承BaseDao;
这样基本上就实现了大量的基础方法,如果DAO中又一些特殊方法,再再具体的实现类的DAO中创建。
BaseDao设计流程图:
此处需要用到Class的对象来获取泛型的class,具体代码:
/**
* 创建一个Class的对象来获取泛型的class
*/
private Class clz;
@SuppressWarnings("unchecked")
public Class getClz(){
if (clz==null) {
clz=(Class)(((ParameterizedType)this.getClass().getGenericSuperclass()).getActualTypeArguments()[0]);
}
return clz;
}
在Spring整合hibernate(3)之基于HibernateDaoSupport的整合的基础上,具体实现关键代码:
IBaseDao类
package org.oms.spring.dao;
import java.util.List;
public interface IBaseDao {
public void add(T t);
public void delete(int id);
public void uodate(T t);
public T load(int id);
public List list(String hql, Object[] args);
}
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 extends HibernateDaoSupport implements IBaseDao{
@Resource(name="sessionFactory")
public void setSuperSessionFactory(SessionFactory sessionFactory) {
super.setSessionFactory(sessionFactory);
}
/**
* 创建一个Class的对象来获取泛型的class
*/
private Class clz;
@SuppressWarnings("unchecked")
public Class getClz(){
if (clz==null) {
clz=(Class)(((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 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 list=query.list();
return list;
}
}
package org.oms.spring.dao;
import org.oms.spring.model.User;
public interface IUserDao extends IBaseDao {
//此方法为特殊方法,因此单独编写
public void add(User user,int gid);
}
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 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);
}
}
package org.oms.spring.dao;
import org.oms.spring.model.Group;
public interface IGroupDao extends IBaseDao{
}
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 implements IGroupDao {
}
源码下载地址:http://download.csdn.net/detail/rzg813/8030109
个人备忘笔记,呵呵~~!