第29章 J2EE SSH基础学习-Struts2-基于Hibernate的组合查询和分页技术实现

本章主要借助于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";
}

猜你喜欢

转载自blog.csdn.net/qq_36346496/article/details/80530225