HibernateDaoSupport的用法。。。
2013-06-12 17:11
543 查看
Spring为Hibernate提供了一个HibernateDaoSupport的基类方便我们来处理数据信息,只用继承HibernateDaoSupport就可以了,使用hibernateDaoSupport最大的好处在于可以方便的获取到hibernate的session。
下面是BaseDao类的代码:
下面是IBaseDao接口的代码:
下面是BaseDao类的代码:
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; import org.zttc.itat.filter.OpenSessionFilter; import org.zttc.itat.model.Pager; import org.zttc.itat.model.SystemContext; /** * 可以考虑把所有公共的方法都写在baseDAo中,这个时候,让所有的DAO都继承BaseDao * 这样基本上就实现了大量的基础方法,如果DAO中有一些特殊的方法,再在具体的实现类的 * DAO中创建 * @author Administrator * * @param <T> */ public class BaseDao<T> extends HibernateDaoSupport implements IBaseDao<T>{ /** * 此处不能使用setSessionFactory注入,因为setSessionFactory在HibernateDaoSupport * 中已经定义了而且还是final的,所以不能被覆盖 * @param sessionFactory */ @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) { //获取泛型的Class对象 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 update(T t) { this.getHibernateTemplate().update(t); } @Override public T load(int id) { // return this.getHibernateTemplate().load(T.c, id); /** * 如果使用了自定义的OpenSessionFilter,需要按照如下方法来获取 */ /*return (T)OpenSessionFilter.getSession() .load(getClz(), id);*/ /** * 如果使用Spring所提供的OpenSessionInViewerFilter就按照整合的方法处理即可 */ return this.getHibernateTemplate().load(getClz(), id); } @SuppressWarnings("unchecked") @Override public List<T> list(String hql, Object[] args) { Query u = this.getSession().createQuery(hql); if(args!=null) { for(int i=0;i<args.length;i++) { u.setParameter(0, args[i]); } } List<T> list = u.list(); return list; } @Override public List<T> list(String hql) { return this.list(hql,null); } @Override public List<T> list(String hql, Object arg) { return this.list(hql,new Object[]{arg}); } @SuppressWarnings("unchecked") @Override public Pager<T> find(String hql, Object[] args) { Pager<T> pages = new Pager<T>(); int pageOffset = SystemContext.getPageOffset(); int pageSize = SystemContext.getPageSize(); Query q = this.getSession().createQuery(hql); Query cq = this.getSession().createQuery(getCountHql(hql)); if(args!=null) { int index = 0; for(Object arg:args) { q.setParameter(index, arg); cq.setParameter(index, arg); index++; } } long totalRecord = (Long)cq.uniqueResult(); q.setFirstResult(pageOffset); q.setMaxResults(pageSize); List<T> datas = q.list(); pages.setDatas(datas); pages.setPageOffset(pageOffset); pages.setPageSize(pageSize); pages.setTotalRecord(totalRecord); return pages; } private String getCountHql(String hql) { //1、获取from前面的字符串 String f = hql.substring(0, hql.indexOf("from")); //2、将from前面的字符串替换为select count(*) if(f.equals("")) { hql = "select count(*) "+hql; } else { hql = hql.replace(f, "select count(*) "); } //3、将fetch替换为"",因为抓取查询不能使用count(*) hql = hql.replace("fetch"," "); return hql; } @Override public Pager<T> find(String hql, Object arg) { return this.find(hql,new Object[]{arg}); } @Override public Pager<T> find(String hql) { return this.find(hql,null); } }
下面是IBaseDao接口的代码:
package org.zttc.itat.dao; import java.util.List; import org.zttc.itat.model.Pager; public interface IBaseDao<T> { public void add(T t); public void delete(int id); public void update(T t); public T load(int id); public List<T> list(String hql,Object[] args); public List<T> list(String hql); public List<T> list(String hql,Object arg); public Pager<T> find(String hql,Object[] args); public Pager<T> find(String hql,Object arg); public Pager<T> find(String hql); }
相关文章推荐
- spring中的HibernateDaoSupport的用法(Session是如何获取的)
- SSH中daoImpl类继承HibernateDaoSupport的用法
- spring中的HibernateDaoSupport的用法
- spring中的HibernateDaoSupport的用法
- HibernateDaosupport,HibernateCallback,HibernateTemplate的用法
- hibernateTemplate和HibernateDaoSupport的用法
- spring中的HibernateDaoSupport的用法
- spring中的HibernateDaoSupport的用法
- HibernateDaoSupport的用法、Hibernate模板的用法
- HibernateTemplate、HibernateDaoSupport两种方法实现增删改查Good
- 由openSession、getCurrentSession和HibernateDaoSupport浅谈Spring对事物的支持
- spring的HibernateDaoSupport、HibernateTemplate、jdbcTemplate的区别
- spring的HibernateDaoSupport以及HibernateTemplate和jdbcTemplate的选择问题
- 关于该死的HibernateDaoSupport
- hibernateTemplate和hibernateDaoSupport的注意问题!
- Java程序员从笨鸟到菜鸟之(八十一)细谈Spring(十)深入源码分析Spring之HibernateTemplate 和HibernateDaoSupport
- HibernateDaoSupport的使用
- HibernateDaoSupport 简介
- HibernateDaoSupport 简介
- LocalSessionFactoryBean为什么能注入到HibernateDaoSupport