我们在进行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);
}
}