接口:
/**
* 抽取持久层通用方法
* @param <T>
*/
public interface IBaseDao<T> {
public void save(T entity);
public void delete(T entity);
public void update(T entity);
public void saveOrUpdate(T entity);
public T findById(Serializable id);
public List<T> findAll();
//提供通用修改方法
public void executeUpdate(String queryName,Object ...objects);
//PageBean封装通用分页组件
public void pageQuery(PageBean pageBean);
//DetachedCriteria 离线查询方法
public List<T> findByCriteria(DetachedCriteria detachedCriteria);
}
接口实现
/**
* 持久层通用实现
*/
public class BaseDaoImpl<T> extends HibernateDaoSupport implements IBaseDao<T> {
// 实体类型
private Class<T> entityClass;
// 使用注解方式进行依赖注入
@Resource
public void setMySessionFactory(SessionFactory sessionFactory) {
super.setSessionFactory(sessionFactory);
}
/**
* 在构造方法中动态获得操作的实体类型
*/
public BaseDaoImpl() {
// 获得父类(BaseDaoImpl<T>)类型
ParameterizedType genericSuperclass = (ParameterizedType) this
.getClass().getGenericSuperclass();
// 获得父类上的泛型数组
Type[] actualTypeArguments = genericSuperclass.getActualTypeArguments();
entityClass = (Class<T>) actualTypeArguments[0];
}
public void save(T entity) {
this.getHibernateTemplate().save(entity);
}
public void delete(T entity) {
this.getHibernateTemplate().delete(entity);
}
public void update(T entity) {
this.getHibernateTemplate().update(entity);
}
public void saveOrUpdate(T entity) {
this.getHibernateTemplate().saveOrUpdate(entity);
}
public T findById(Serializable id) {
return this.getHibernateTemplate().get(entityClass, id);
}
@SuppressWarnings("unchecked")
public List<T> findAll() {// FROM User
String hql = "FROM " + entityClass.getSimpleName();
return (List<T>) this.getHibernateTemplate().find(hql);
}
/**
* 通用更新方法
*/
public void executeUpdate(String queryName, Object... objects) {
Session session = this.getSession();// 从本地线程中获得session对象
// 使用命名查询语句获得一个查询对象
Query query = session.getNamedQuery(queryName);
// 为HQL语句中的?赋值
int i = 0;
for (Object arg : objects) {
query.setParameter(i++, arg);
}
query.executeUpdate();// 执行更新
}
/**
* 通用分页查询方法
*/
public void pageQuery(PageBean pageBean) {
int currentPage = pageBean.getCurrentPage();
int pageSize = pageBean.getPageSize();
DetachedCriteria detachedCriteria = pageBean.getDetachedCriteria();
//总数据量----select count(*) from t_staff
//改变Hibernate框架发出的sql形式
//select count(*) from t_staff
detachedCriteria.setProjection(Projections.rowCount());
List<Long> list = (List<Long>) this.getHibernateTemplate().
findByCriteria(detachedCriteria);
Long total = list.get(0);
pageBean.setTotal(total.intValue());//设置总数据量
detachedCriteria.setProjection(null);//修改sql的形式为select * from ....
//重置表和类的映射关系
detachedCriteria.setResultTransformer(DetachedCriteria.ROOT_ENTITY);
//当前页展示的数据集合
int firstResult = (currentPage - 1) * pageSize;
int maxResults = pageSize;
List rows = this.getHibernateTemplate().
findByCriteria(detachedCriteria, firstResult, maxResults);
pageBean.setRows(rows);
}
public List<T> findByCriteria(DetachedCriteria detachedCriteria) {
return (List<T>) this.getHibernateTemplate().
findByCriteria(detachedCriteria);
}
}
通用分页组
/**
* 封装分页信息
*/
public class PageBean {
private int currentPage;//当前页码
private int pageSize;//每页显示记录数
private DetachedCriteria detachedCriteria;//离线条件查询对象,包装查询条件
private int total;//总记录数
private List rows;//当前页需要展示的数据集合
public int getCurrentPage() {
return currentPage;
}
public void setCurrentPage(int currentPage) {
this.currentPage = currentPage;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public int getTotal() {
return total;
}
public void setTotal(int total) {
this.total = total;
}
public DetachedCriteria getDetachedCriteria() {
return detachedCriteria;
}
public void setDetachedCriteria(DetachedCriteria detachedCriteria) {
this.detachedCriteria = detachedCriteria;
}
public List getRows() {
return rows;
}
public void setRows(List rows) {
this.rows = rows;
}
}