当出现大量的数据时,就需要我们通过分页来实现,这样不仅可以减轻用户对我们服务器的访问压力,还可以增强网站的流畅度、提高用户的体验度,接下来就介绍一下自己在项目中分页的实现,很基础,但是很实用!
开发环境:
1.mysql数据库
2.IDE:MyEclipse
实现分页的关键在于对limit函数的使用,首先让我们了解一下limit的使用和原理。
☆limit的认识:
SELECT * FROM t_user LIMIT m,n
以上语句含义为从t_user表中查找记录,记录从第m+1条开始,一直取其后的n条记录。
实例:SELECT * FROM t_user LIMIT 2,3
结果如下:
t_user的所有记录:
so,通过MySql实现分页的核心就是对limit函数的使用,将页面的页号和每页的大小通过计算得到limit函数的m & n,进而实现分页。
代码清单如下:
<span style="font-family:KaiTi_GB2312;font-size:18px;">/*
* 分页查询
*
* @author zhangh
*
* @param pageNo 页号
*
* @param pageSize 一页大小
*/
public PageModel findUserList(int pageNo, int pageSize) {
String sql = "select user_id, user_name, password, contact_tel, email, create_date from t_user where user_id <> 'root' order by user_id asc LIMIT ?,?";
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
PageModel pageModel = null;
try {
conn = DbUtil.getConnection();
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, (pageNo - 1) * pageSize);
pstmt.setInt(2, pageSize);
rs = pstmt.executeQuery();
List userList = new ArrayList();
//获取集合中的关键字隐射到实体
while (rs.next()) {
User user = new User();
user.setUserId(rs.getString("user_id"));
user.setUserName(rs.getString("user_name"));
user.setPassword(rs.getString("password"));
user.setContactTel(rs.getString("contact_tel"));
user.setEmail(rs.getString("email"));
user.setCreateDate(rs.getTimestamp("create_date"));
userList.add(user);
}
pageModel = new PageModel();
pageModel.setList(userList);
pageModel.setTotalRecords(getTotalRecords(conn));
pageModel.setPageSize(pageSize);
pageModel.setPageNo(pageNo);
} catch (SQLException e) {
e.printStackTrace();
} finally {
DbUtil.close(rs);
DbUtil.close(pstmt);
DbUtil.close(conn);
}
return pageModel;
}</span>
为了方便,单独封装了一个关于分页的实体,代码清单如下:
<span style="font-family:KaiTi_GB2312;font-size:18px;">package com.bjpowernode.drp.util;
import java.util.List;
/*
* 封裝分页实体
* @author
* @return
* */
public class PageModel {
//結果集
private List list;
//查询记录数
private int totalRecords;
//每页多少条数据
private int pageSize;
//第几页
private int pageNo;
//共多少页
public int getTotalPages(){
return (totalRecords+pageSize-1)/pageSize;
};
//取得首页
public int getTopPageNo(){
return 1;
}
//取得尾页
public int getBottomPageNo(){
return getTotalPages();
}
//上一页
public int getPreviousPageNo(){
if (pageNo<=1) {
return 1;
}
return pageNo-1;
}
//下一页
public int getNextPageNo(){
if (pageNo>=getBottomPageNo()) {
return getBottomPageNo();
}
return pageNo+1;
}
public List getList() {
return list;
}
public void setList(List list) {
this.list = list;
}
public int getTotalRecords() {
return totalRecords;
}
public void setTotalRecords(int totalRecords) {
this.totalRecords = totalRecords;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public int getPageNo() {
return pageNo;
}
public void setPageNo(int pageNo) {
this.pageNo = pageNo;
}
}
</span>
由于是比较基础的功能,具体代码就不再一一解释,有需要的同学可以私信我或者评论留言。介绍完了mysql分页,就不得不提一下oracle的分页,由于oracle本身的特性,我们可以根据其自身的rownum来取得每一页的记录,当提供了每一页的大小和页数时,可以计算得到每一页的开始记录rownum和结束记录rownum,进而可以得到某一页的所有数据,具体代码没有写,有用的上的同学可以自行搜索一下O(∩_∩)O~!