基于hibernate的泛型dao实现

我们在进行hibernate开发时,因为hibernate是基于对象的ORM,所以由此我们可以在hibernate的基础上在做一层封装,从而大大简化我们的DAO层代码。

首先封装一个分页工具类:Pager<T>

public class Pager<T> {

	private int offset;
	private int pagesize;
	private Long total;
	private List<T> datas;
  //此处省去get 和 set
}

泛型接口:

package com.bawei.tonysong.util;

import java.util.List;

public interface IGenericDao<T, PK extends Number> {

	  List<T> findAll(String hql,Object[] args);
	  List<T> findAll(String hql,Object object);
	  List<T> findAll(String hql);
	  
	  
	  Pager<T> pageList(String hql,Object[] args);
	  Pager<T> pageList(String hql,Object object);
	  Pager<T> pageList(String hql);
	  
	  void save(T t);
	  void update(T t);
	  void delete(T t);
	  
	  T findById(PK id);
	  
	  
}

 泛型接口实现类:

package com.bawei.tonysong.util;

import java.util.List;

import javax.annotation.Resource;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;



@SuppressWarnings("unchecked")
public class GenericDao<T,PK extends Number> implements IGenericDao<T, PK> {

	@Resource
	private SessionFactory sessionFactory;
	
	
	protected Session getSession(){
		return this.sessionFactory.getCurrentSession();
	}
	
	private Class<T> clazz;
	
	public GenericDao() {
		this.clazz=(Class<T>)((java.lang.reflect.ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[0];
	}
	
	@Override
	public List<T> findAll(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();
	}

	@Override
	public List<T> findAll(String hql, Object object) {
		return this.findAll(hql, new Object[]{object});
	}

	@Override
	public List<T> findAll(String hql) {
		// TODO Auto-generated method stub
		return this.findAll(hql, null);
	}

	
	private String getCountSql(String hql){
		return hql.startsWith("from") ? "select count(*) "+hql : hql;
	}
	
	@Override
	public Pager<T> pageList(String hql, Object[] args) {
		Pager<T> pager=new Pager<T>();
		int offset=SystemContext.getOffset();
		int pagesize=SystemContext.getPagesize();
		
		Query q=this.getSession().createQuery(hql);
		
		if(args!=null){
			for(int i=0;i<args.length;i++){
				q.setParameter(i, args[i]);
			}
		}
		
		List<T> datas= q.setFirstResult(offset).setMaxResults(pagesize).list();
		
		Long total= (Long)this.getSession().createQuery(this.getCountSql(hql)).uniqueResult();
		
		
		pager.setOffset(offset);
		pager.setPagesize(pagesize);
		pager.setTotal(total);
		pager.setDatas(datas);
		return pager;
	}

	@Override
	public Pager<T> pageList(String hql, Object object) {
		return this.pageList(hql, new Object[]{object});
	}

	@Override
	public Pager<T> pageList(String hql) {
		return this.pageList(hql, null);
	}

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

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

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

	
	@Override
	public T findById(PK id) {
		return (T) this.getSession().get(this.clazz, id);
	}

}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值