介绍:
使用SSH整合开发,进行分页查询,我采用了hibernate的两种不同对象来操作,第一种:DetachedCriteria离线对象;第一种:是hibernateTemplate模板的HibernateCallback<>()函数回调,实际上它是一个接口,使用它时,需要实现它里面的方法。
分页思路:
刚开始我也觉得分页查询很难,但其实理清了思路之后,其实一点都不难。
其实分页的目的,是为前台用户服务的,作用在于让数据有规则性的显示给用户。
重点来了,如何实现呢?
1、使用hibernate框架操作持久层操作数据时,他为我们提供了两个分页的函数:setFirstResult() 设置起始查询索引、setMaxResults()设置每次查询多少条。还有表的总记录数,可以使用find(hql).size()来获取,到此分页时,持久层所做的工作,就到此结束了。
2、上面说到从数据库中获取分页数据,如果不使用传参方式进行获取数据时,那只是一个固定的一页数据,数据永远不会变,它不符合我们的前台需求,前台客户所需的功能,是可以灵活的点击上一页,下一页或跳页来显示数据,因此客户点击页数时候,就会向后台传递了参数发出请求,获取数据。这时候,就需要进行持久层的传参,来完成灵活的分页了。该如何传参,这应该是业务层的事情,service层的任务就是进行传参,去完成客户的需求和从数据库中获取分好页的数据,并将分好页的数据封装好,并传给前台客户。
3、service层该是如何封装分页的数据呢?这时就需要我们自定义一个分页Bean来获取分好页的数据,通过这个Bean来传给controller层,再传给客户。
思路总结:分页的总思路,只需理解分页Bean即可,这个bean相当于一艏小船,在来回不停地,将分好页的数据运输给前台,再将前台给它的数据清单去到service层中取数据,如何取,按照前台的传给它的参数来取数据。
第一种分页方法:DetachedCriteria离线对象
1、实体类:User.java
import java.io.Serializable;
public class User implements Serializable{
private static final long serialVersionUID = 1L;
private int userId;
private String userName;
private String userPassword;
private String userType;
public User() {
}
public User(String userName, String userPassword, String userType) {
this.userName = userName;
this.userPassword = userPassword;
this.userType = userType;
}
//get与set方法省略......
}
2、映射文件:
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="cn.lice.entity">
<class name="User" table="user">
<id name="userId" type="int">
<column name="userId" precision="22" scale="0"/>
<generator class="identity" />
</id>
<property name="userName" type="java.lang.String">
<column name="userName" not-null="false" length="100" />
</property>
<property name="userPassword" type="java.lang.String">
<column name="userPassword" length="100" not-null="false" />
</property>
<property name="userType" type="java.lang.String">
<column name="userType" length="500" not-null="false"/>
</property>
</class>
</hibernate-mapping>
3、自定义PageBean
import java.io.Serializable;
import java.util.List;
/**
- 用于封装分页数据对象
- 服务器做的事情
- @author 11606
*
*/
public class Page implements Serializable {
//这三条不是我们能知道的
private int currentPageNum; //当前页数 (用户提供)
private int pageSize=5; //每页记录条数 (设定)
private int totalRecords; //总记录数 (从数据库中查询)
//能计算的数据
private int startIndex; //查询开始记录索引
private int totalPageNum; //总页数
private List pageData; //分好页的结果集 (结果条数为pageSize,设定好的)
private int prePageNum; //上一页
private int nextPageNum; //下一页
//用于显示页码的属性,在页面上最多显示9页,当前页在允许的情况下,永远居中
private int beginPageNum;
private int endPageNum;
/**
* 要想使用此类,必须提供两个参数
* @param currentPageNum 当前页
* @param totalRecords 总记录条数
*/
public Page(int currentPageNum,int totalRecords) {
this.currentPageNum = currentPageNum