基于Hibernate的dao层抽取,依赖PageBean - BaseDao与BaseDaoImpl
分页工具类PageBean
package com.hao.mybos.utils; import java.util.List; import org.hibernate.criterion.DetachedCriteria; public class PageBean<T> { //当前页 private Integer currentPage; //每页记录数 private Integer pageSize; //总记录数 private Integer totalCount; //总页数 private Integer totalPage; //开始索引 private Integer startIndex; //数据 private List<T> data; //离线查询对象 private DetachedCriteria dc; public PageBean(Integer currentPage, Integer pageSize, Integer totalCount){ this.currentPage = currentPage; this.pageSize = pageSize; this.totalCount = totalCount; doCalculate(); } /** * 更新计算的信息,用于调用set方法后 */ public void doCalculate(){ if(this.currentPage == null){ //如页面没有指定显示那一页.显示第一页. this.currentPage = 1; } if(this.pageSize == null){ //如果每页显示条数没有指定,默认每页显示3条 this.pageSize = 3; } this.totalPage = (totalCount-1)/pageSize + 1; //判断当前页数是否超出范围 //不能小于1 if(this.currentPage < 1){ this.currentPage = 1; } //不能大于总页数 if(this.currentPage > this.totalPage){ this.currentPage = this.totalPage; } //根据当前页和每页显示条数计算起始索引 this.startIndex = (currentPage-1) * pageSize; } 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 getTotalCount() { return totalCount; } public void setTotalCount(int totalCount) { this.totalCount = totalCount; } public int getTotalPage() { return totalPage; } public void setTotalPage(int totalPage) { this.totalPage = totalPage; } public int getStartIndex() { return startIndex; } public void setStartIndex(int startIndex) { this.startIndex = startIndex; } public List<T> getData() { return data; } public void setData(List<T> data) { this.data = data; } public DetachedCriteria getDc() { return dc; } public void setDc(DetachedCriteria dc) { this.dc = dc; } }
BaseDao接口
package com.hao.mybos.dao; import java.io.Serializable; import java.util.List; import org.hibernate.criterion.DetachedCriteria; import com.hao.mybos.utils.PageBean; public interface BaseDao<T> { //基本操作 /** * 保存实体 * @param entity */ void save(T entity); /** * 删除实体 * @param entity */ void delete(T entity); /** * 根据实体Id删除实体 * @param id */ void deleteById(Serializable id); /** * 更新实体信息 * @param entity */ void update(T entity); /** * 保存或更新实体 * @param entity */ void saveOrUpdate(T entity); /** * 根据Id查询实体 * @param id * @return */ T findById(Serializable id); /** * 根据离线查询对象执行查询 * @param detachedCriteria * @return */ public List<T> findByCriteria(DetachedCriteria dc); /** * 查询所有实体信息 * @return */ List<T> list(); //分页查询相关 /** * 查询实体的总数 * @param dc * @return */ Integer getTotalCount(DetachedCriteria dc); /** * 分页查询实体,结合上面的查询实体总数使用,更加通用 * @param dc 离线查询条件 * @param start 查询起始下标 * @param pageSize 每页的记录条数 * @return */ List<T> getPageList(DetachedCriteria dc, Integer start, Integer pageSize); /** * 基于PageBean的分页查询,依赖PageBean实体 * @param pageBean 查询实体,其中含有离线查询对象DC */ void pageQuery(PageBean<T> pageBean); //其他便捷操作 /** * 使用hbm中自定义的基于HQL的查询名称进行部分列的更新 * @param queryName * @param objects 待更新的列的值 */ void executeUpdate(String queryName, Object... objects); }
BaseDaoImpl实现类
package com.hao.mybos.dao; import java.io.Serializable; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.util.List; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.criterion.DetachedCriteria; import org.hibernate.criterion.Projections; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.orm.hibernate5.support.HibernateDaoSupport; import com.hao.mybos.utils.PageBean; public class BaseDaoImpl<T> extends HibernateDaoSupport implements BaseDao<T>{ public void save(T entity) { getHibernateTemplate().save(entity); } public void delete(T entity) { getHibernateTemplate().delete(entity); } public void deleteById(Serializable id) { T entity = getHibernateTemplate().load(entityClass, id); getHibernateTemplate().delete(entity); } public void update(T entity) { getHibernateTemplate().delete(entity); } public void saveOrUpdate(T entity) { getHibernateTemplate().saveOrUpdate(entity); } public T findById(Serializable id) { return getHibernateTemplate().get(entityClass, id); } public List<T> findByCriteria(DetachedCriteria dc) { @SuppressWarnings("unchecked") List<T> res = (List<T>) getHibernateTemplate().findByCriteria(dc); return res; } public List<T> list() { return getHibernateTemplate().loadAll(entityClass); } public Integer getTotalCount(DetachedCriteria dc) { //设置查询的聚合函数 dc.setProjection(Projections.rowCount()); @SuppressWarnings("unchecked") List<Long> idList = (List<Long>) getHibernateTemplate().findByCriteria(dc); //清空之前设置的聚合函数 dc.setProjection(null); if(idList!=null && idList.size()>0){ Long count = idList.get(0); return count.intValue(); }else{ return null; } } public List<T> getPageList(DetachedCriteria dc, Integer start, Integer pageSize) { dc.setResultTransformer(DetachedCriteria.ROOT_ENTITY); @SuppressWarnings("unchecked") List<T> list = (List<T>) getHibernateTemplate().findByCriteria(dc, start, pageSize); return list; } @SuppressWarnings("unchecked") public void pageQuery(PageBean<T> pageBean) { DetachedCriteria dc = pageBean.getDc(); //指定Hibernate框架发出sql的形式 - 查询记录总数 dc.setProjection(Projections.rowCount()); List<Long> countList = (List<Long>) getHibernateTemplate().findByCriteria(dc); Long count = countList.get(0); pageBean.setTotalCount(count.intValue()); //更新信息 pageBean.doCalculate(); //清空指定的查询记录数,以进行分页查询 dc.setProjection(null); //指定Hibernate封装对象的方式:涉及多表查询时,以查询的目标实体类型返回 dc.setResultTransformer(DetachedCriteria.ROOT_ENTITY); List<T> rows = (List<T>) getHibernateTemplate().findByCriteria(dc,pageBean.getStartIndex(),pageBean.getPageSize()); pageBean.setData(rows); } public void executeUpdate(String queryName, Object... objects) { Session session = this.getSessionFactory().getCurrentSession(); //根据定义的查询名称创建对应的Query对象 Query query = session.getNamedQuery(queryName); //为HQL中的占位符赋值 int index = 0; for (Object object : objects) { query.setParameter(index++, object); } //执行更新 query.executeUpdate(); } private Class<T> entityClass; @SuppressWarnings("unchecked") public BaseDaoImpl() { // 获取子类对象的父类类型 ParameterizedType superClass = (ParameterizedType) this.getClass() .getGenericSuperclass(); // 获得在父类类型上声明的泛型数组 Type[] genericTypes = superClass.getActualTypeArguments(); // 第一个泛型即为实体类型 entityClass = (Class<T>) genericTypes[0]; } @Autowired public void setSF(SessionFactory sessionFactory){ setSessionFactory(sessionFactory); } }