本章主要借助于StudentQueryHelper类对象进行了条件组合查询的基础实现,其基本思路就是将各种条件封装在QueryHelper类里面,然后调用Hibernate的DetachedCriteria将组合条件进行拆解并组合。最后执行查询请求。
分页技术基本上借助了Page这个类对象完成了页面的分页功能。就是将查询到的信息放到page里面替代我们原来的直接使用List记录集,从而实现了页面的分解。其基本代码如下:
StudentQueryHelper.java
/** * @Title: StudentWQuryHelper.java * @package: edu.fjnu.training.service * @author: Zhou kailun * @date: 2018年5月30日 下午11:14:27 * @version: V1.0 */ package edu.fjnu.training.service; import edu.fjnu.training.domain.ValueObject; /** * ClassName: StudentWQuryHelper 查询辅助类 * Description: TODO * Author: Zhou kailun * */ public class StudentQueryHelper extends ValueObject { /**学号 精确查询*/ private String qryStuNo; /**姓名 模糊查询*/ private String qryStuName; /**班级精确查询*/ private Integer qryClazzNo; /**成绩范围查询 最小*/ private Integer qryMinStuMark; /**成绩范围查询 最大*/ private Integer qryMaxStuMark; /**性别查询*/ private String qryStuSex; /**籍贯查询*/ private String qryStuOrigin; /** * <p>Title: </p> * <p>Description: </p> */ public StudentQueryHelper() { // TODO Auto-generated constructor stub } public String getQryStuNo() { return qryStuNo; } public void setQryStuNo(String qryStuNo) { this.qryStuNo = qryStuNo; } public String getQryStuName() { return qryStuName; } public void setQryStuName(String qryStuName) { this.qryStuName = qryStuName; } public Integer getQryClazzNo() { return qryClazzNo; } public void setQryClazzNo(Integer qryClazzNo) { this.qryClazzNo = qryClazzNo; } public Integer getQryMinStuMark() { return qryMinStuMark; } public void setQryMinStuMark(Integer qryMinStuMark) { this.qryMinStuMark = qryMinStuMark; } public Integer getQryMaxStuMark() { return qryMaxStuMark; } public void setQryMaxStuMark(Integer qryMaxStuMark) { this.qryMaxStuMark = qryMaxStuMark; } public String getQryStuSex() { return qryStuSex; } public void setQryStuSex(String qryStuSex) { this.qryStuSex = qryStuSex; } public String getQryStuOrigin() { return qryStuOrigin; } public void setQryStuOrigin(String qryStuOrigin) { this.qryStuOrigin = qryStuOrigin; } }
StudentDao.java
/** * Title:条件加载学生对象列表<br> * Description: 根据传入参数查找学生信息列表 <br> * @param helper 查找条件 * @return List<Student> 学生列表 * @throws */ public List<Student> loadStudents(StudentQueryHelper helper); /** * Title:条件统计学生数量 <br> * Description:在这样的查询条件下,总共有多少条学生记录。 <br> * @param helper 查询条件 * @return Long 学生数量 * @throws */ Long cntStudentsByHelper(StudentQueryHelper helper); /** * Title:范围查找条件查找学生对象列表 <br> * Description:根据输入的条件查找学生对象列表。范围查找 <br> * @param helper 查找条件 * @param beginIndex 开始范围 * @param fetchSize 到达范围 * @return List<Student> 学生信息列表 * @throws */ List<Student> loadScopeStudentsByHelper(StudentQueryHelper helper,int beginIndex,int fetchSize);
StudentDaoHibernateImpl.java
@Override public List<Student> loadStudents(StudentQueryHelper helper) { DetachedCriteria criteria=this.genCriteriaByHelper(helper); Session session=HibernateUtils.createSession(); Transaction trans=null; List<Student> stuList=null; trans=session.beginTransaction(); try{ criteria.addOrder(Order.asc("stuNo")); stuList=criteria.getExecutableCriteria(session).list(); trans.commit(); }catch(HibernateException e){ e.printStackTrace(); trans.rollback(); }finally{ if(session.isOpen()){ session.close(); } } return stuList; } /** * Title:获得(生成)DetachedCriteria对象(条件分离对象) <br> * Description:根据传入的Helper生成DetachedCriteria对象<br> * @param helper 查询条件 * @return DetachedCriteria 条件分离对象 * @throws */ private DetachedCriteria genCriteriaByHelper(StudentQueryHelper helper){ DetachedCriteria criteria=DetachedCriteria.forClass(Student.class); if(StringUtils.isNotEmpty(helper.getQryStuNo())){ criteria.add(Restrictions.eq("stuNo", helper.getQryStuNo())); } if(StringUtils.isNotEmpty(helper.getQryStuName())){ criteria.add(Restrictions.like("stuName","%"+helper.getQryStuName()+"%")); } if(helper.getQryMinStuMark()!=null){ criteria.add(Restrictions.ge("stuMark", helper.getQryMinStuMark())); } if(helper.getQryMaxStuMark()!=null){ criteria.add(Restrictions.le("stuMark", helper.getQryMaxStuMark())); } if(StringUtils.isNotEmpty(helper.getQryStuSex())){ criteria.add(Restrictions.eq("stuSex", helper.getQryStuSex())); } if(StringUtils.isNotEmpty(helper.getQryStuOrigin())){ criteria.add(Restrictions.eq("stuOrigin", helper.getQryStuOrigin())); } if(helper.getQryClazzNo()!=null){ criteria.createCriteria("clazz").add(Restrictions.eqOrIsNull("clazzNo", helper.getQryClazzNo())); } return criteria; } @Override public Long cntStudentsByHelper(StudentQueryHelper helper) { DetachedCriteria detachedCriteria=this.genCriteriaByHelper(helper); //增加投影运算。就是我要做的事情类型 detachedCriteria.setProjection(Projections.rowCount()); long cnt=0; Session session=HibernateUtils.createSession(); Transaction trans = session.beginTransaction(); try{ cnt = Long.parseLong(detachedCriteria.getExecutableCriteria(session).list().get(0).toString()); trans.commit(); }catch(HibernateException e){ e.printStackTrace(); trans.rollback(); }finally{ if(session.isOpen()){ session.close(); } } return cnt; } @Override public List<Student> loadScopeStudentsByHelper(StudentQueryHelper helper,int beginIndex,int fetchSize) { DetachedCriteria detachedCriteria = this.genCriteriaByHelper(helper); detachedCriteria.addOrder(Order.asc("stuNo")); List<Student> stuList = null; Session session = HibernateUtils.createSession(); Transaction trans = session.beginTransaction(); try{ stuList = detachedCriteria.getExecutableCriteria(session) .setFirstResult(beginIndex) .setMaxResults(fetchSize) .list(); trans.commit(); }catch(HibernateException e) { e.printStackTrace(); trans.rollback(); }finally{ if(session.isOpen()){ session.close(); } } return stuList; }
StudentService.java
/** * Title:条件查询学生列表 <br> * Description:根据传入的查询条件StudentQueryHelper 对象进行查询 <br> * @param helper StudentQueryHelper对象查询条件 * @return List<Student> 学生列表 * @throws */ public List<Student> loadStudent(StudentQueryHelper helper); /** * Title: 获得学生页面信息<br> * Description: 页号和规模 查询条件获得学生页面信息页面<br> * @param helper 查询条件 * @param page 页号和页面规模 * @return Page 记录页面内容 * @throws */ public Page loadPagedStudents(StudentQueryHelper helper,Page page);
Page.java
/** * @Title: Page.java * @package: edu.fjnu.training.utils * @author: Zhou kailun * @date: 2018年5月31日 下午6:43:40 * @version: V1.0 */ package edu.fjnu.training.utils; import java.util.Collection; /** * ClassName: Page * Description: TODO * Author: Zhou kailun * */ public class Page { /**当前页号*/ private Integer pageNo; /**每页记录条数*/ private Integer pageSize; /**是否有下一页*/ private Boolean nextPage; /**是否有上一页*/ private Boolean prePage; /**总共有多少条记录(页面相关联的查询,总共有多少条记录)*/ private Long totalRecNum; /**总共多少页*/ private Integer totalPageNum; /**页面的数据*/ private Collection pageContent; /**记录开始位置*/ private Integer startIndex; /**记录结束位置*/ private Integer endIndex; /** * <p>Title: </p> * <p>Description: </p> */ public Page() { super(); pageNo=1; pageSize=3; } public Integer getPageNo() { return pageNo; } public void setPageNo(Integer pageNo) { this.pageNo = pageNo; } public Integer getPageSize() { return pageSize; } public void setPageSize(Integer pageSize) { this.pageSize = pageSize; } public Boolean getNextPage() { return pageNo<getTotalPageNum()?true:false; } public Boolean getPrePage() { return pageNo>1?true:false; } public Long getTotalRecNum() { return totalRecNum; } public void setTotalRecNum(Long totalRecNum) { this.totalRecNum = totalRecNum; } /** * Title:获取总页面数量 <br> * Description: 获取资源总页面数量<br> * @return Integer 页面总数 * @throws */ public Integer getTotalPageNum() { return totalRecNum%pageSize>0?(int)(totalRecNum/pageSize+1):(int)(totalRecNum/pageSize); } public Collection getPageContent() { return pageContent; } public void setPageContent(Collection pageContent) { this.pageContent = pageContent; } public Integer getStartIndex() { return pageSize*(pageNo-1); } public Integer getEndIndex() { return (pageSize*pageNo>this.totalRecNum)?(int)(this.totalRecNum.longValue()):(pageSize*pageNo); } }
StudentAction.java
public class StudentAction extends BaseAction { /**学生信息对象*/ private Student stu; /**页面信息*/ private Page page=new Page(); /**学生信息列表*/ private List<Student> stuList; /**班级列表*/ private List<Clazz> clazzList; /**查询辅助对象*/ private StudentQueryHelper helper = new StudentQueryHelper();; /**上传图片名字:与jsp请求网页名字相同,后面两条属性必须一样写入stuPicFilenName,stuPicContentType */ private File stuPic; private String stuPicFileName; private String stuPicContentType;public String loadStudents()throws Exception{
StudentService studentService=new StudentServiceImpl();
//stuList=studentService.loadAllStudent();//方法一 原始方法
//stuList = studentService.loadStudent(helper);//条件组合查询方法二
page = studentService.loadPagedStudents(helper, page); //分页查询 方法三
ClazzService clazzService=new ClazzServiceImpl();
clazzList=clazzService.loadClazzList();
return "list_page";
}