hibernate BaseDao

/**基于泛型的公共方法如:add,delete,update,load,list在此定义并由BaseDao提供具体实现*/
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 query,Object[] args);
    public List<T> list(String query);
    public List<T> list(String query,Object arg);
    
    public Pager<T> find(String hql,Object[] args);
    public Pager<T> find(String hql,Object arg);
    public Pager<T> find(String hql);
}

/**可以考虑把所有公共的方法(add,delete,update,load,list)都写在BaseDao中,
 * 让所有的DAO都继承BaseDao,这样基本实现了大量的基础方法,
 * 如果DAO中有一些特殊的方法,再在具体的实现类中实现
 * spring与h4整合取消对HibernateTemplate和DaoSupprt支持
 * ,需直接注入sessionFactory*/
public class BaseDao<T> implements IBaseDao<T>{

    private SessionFactory sessionFactory;
    /**spring整合hibernate3基于DaoSupport操作数据库
     * 整合4不支持DaoSupport*/
    @Resource(name="sessionFactory")
    public void setSessionFactory(SessionFactory sessionFactory){
        this.sessionFactory=sessionFactory;
    }
    
    protected Session getSession(){
        return sessionFactory.getCurrentSession();
    }
    
    /*创建一个Class的对象来获取泛型的calss*/
    private Class<T> clz;
    @Override
    public void add(T t) {
        this.getSession().save(t);
    }

    @Override
    public void delete(int id) {
        this.getSession().delete(this.load(id));
    }

    @Override
    public void update(T t) {
        this.getSession().update(t);
    }

    /**OpenSessionInViewerFilter处理延迟加载*/
    @Override
    public T load(int id) {
        /*如果使用spring所提供的OpenSessionInViewFilter就按照整合的方法处理*/
        return (T) this.getSession().load(this.getClz(), id);
    }

    @SuppressWarnings("unchecked")
    @Override
    public List<T> list(String hql, Object[] args) {
        Query q=this.getSession().createQuery(hql);
        if(args!=null){
            for(int i=0;i<args.length;i++){
                q.setParameter(i, args[i]);
            }
        }
        
        return q.list();
    }

    /**通过反射拿到具体的类*/
    @SuppressWarnings("unchecked")
    public Class<T> getClz() {
        if(clz==null){
            clz=(Class<T>)(((ParameterizedType)this.getClass().getGenericSuperclass())).getActualTypeArguments()[0];
        }
        return clz;
    }

    @Override
    public List<T> list(String query) {
        return this.list(query, null);
    }

    @Override
    public List<T> list(String query, Object arg) {
        return this.list(query, new Object[]{arg});
    }

    @Override
    public Pager<T> find(String hql, Object[] args) {
        Pager<T> pagers=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){
            for(int i=0;i<args.length;i++){
                q.setParameter(i, args[i]);
                cq.setParameter(i, args[i]);
            }
        }
        Long totalRecord=(Long)cq.uniqueResult();
        q.setFirstResult(pageOffset);
        q.setMaxResults(pageSize);
        List<T> datas=q.list();
        pagers.setDatas(datas);
        pagers.setPageOffset(pageOffset);
        pagers.setPageSize(pageSize);
        pagers.setTotalRecord(totalRecord);
        return pagers;
    }
    
    private String getCountHql(String hql){
        /*1.获取HQL中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替换为"",因为抓取查询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);
    }

}


你可能感兴趣的:(hibernate BaseDao)