MySql 分页
由于最近项目需要,于是就简单写了个分页查询。总体而言MySql 分页机制较为简单。数据库方面只需要使用limit即可实现分页。前后台交互就直接用session传了值。
下面就写写具体的实现过程:
首先,创建一个Page VO类
其中,总记录数可由数据库查得、每页默认记录数由你自己设定;
总页数由总记录数及每页默认记录数获取,当然得有一个条件判断;
当前页数由当前记录数及每页默认记录数获取,当然这也得有一个条件判断;
当前记录条数可由页面传值同时配合每页默认记录数获取。
1 packagecom.ctrl.vo;2
3 public classPage {4 private int totalPage;//总页数
5 private int currentPage;//当前页
6 private int totalRecord;//总记录数
7 private int currentRecord=0;//当前记录条数
8 private int pageSize = 10;//每页默认记录数
9
10 public intgetTotalPage() {11 returntotalPage;12 }13
14 public void setTotalPage(int totalRecord, intpageSize) {15 if (totalRecord % pageSize == 0)16 this.totalPage = totalRecord /pageSize;17 else
18 this.totalPage = totalRecord / pageSize + 1;19 }20
21 public intgetCurrentPage() {22 returncurrentPage;23 }24
25 public void setCurrentPage(int currentRecord, intpageSize) {26 if (currentRecord % pageSize == 0)27 this.currentPage = currentRecord /pageSize;28 else
29 this.currentPage = currentRecord / pageSize + 1;30 }31
32 public intgetTotalRecord() {33 returntotalRecord;34 }35
36 public void setTotalRecord(inttotalRecord) {37 this.totalRecord =totalRecord;38 }39
40 public intgetCurrentRecord() {41 returncurrentRecord;42 }43
44 public void setCurrentRecord(intcurrentRecord) {45 this.currentRecord =currentRecord;46 }47
48 @Override49 publicString toString() {50 return "Page [totalPage=" + totalPage + ", currentPage=" +currentPage51 + ", totalRecord=" + totalRecord + ", currentRecord="
52 + currentRecord + ", pageSize=" + pageSize + "]";53 }54
55 public intgetPageSize() {56 returnpageSize;57 }58
59 public void setPageSize(intpageSize) {60 this.pageSize =pageSize;61 }62
63 }
其次,showUsers.jsp页面(有省略,且部分名修改)
IDNAMECODEPWDSTATEFLAGUpdate
${user.id }${user.name }${user.code }${user.pwd }${user.state }${user.flag } updatehref="/showLimitUsers?currentRecord=${page.currentRecord}&type=prev">前一页
/
href="/showLimitUsers?currentRecord=${page.currentRecord}&type=next"> 后一页
.....
对于,servlet后台(SERVICE、DAO层代码省略...)
Page page = newPage();
UserService userService= newUserServiceImpl();//去掉管理员
long totalRecord = userService.getUsersCount() - 1;
page.setTotalRecord((int) totalRecord);
page.setTotalPage(page.getTotalRecord(), page.getPageSize());
String type= request.getParameter("type");if (request.getParameter("currentRecord") != null
&& !request.getParameter("currentRecord").equals("")) {int currentRecord =Integer.parseInt(request
.getParameter("currentRecord"));
page.setCurrentRecord(currentRecord);
page.setCurrentPage(page.getCurrentRecord(), page.getPageSize());if ("next".equals(type)&& page.getCurrentPage() < (page.getTotalPage() - 1)) {
currentRecord= currentRecord + 10;
page.setCurrentRecord(currentRecord);
}else if ("prev".equals(type) && page.getCurrentPage() > 0) {
currentRecord= currentRecord - 10;
page.setCurrentRecord(currentRecord);
}
}else{
page.setCurrentRecord(0);
}
List users =userService.getLimitUsers(page.getCurrentRecord(),
page.getPageSize());
page.setCurrentPage(page.getCurrentRecord(), page.getPageSize());
HttpSession session=request.getSession();//标签是否显示
session.setAttribute("flag", "T");
session.setAttribute("users", users);
session.setAttribute("page", page);
response.sendRedirect(request.getContextPath()+ "/showUsers.jsp");
当用户点击了next,当前记录数就加pageSize,prev则减去pageSize。同时当前页也需要与总页数之间进行比较,以防超越了页数范围。
由于未将所有功能均设置分页,故设定flag标志,当页面其他功能不需要分页的话,可以将分页消除。
效果图:
PS:文中Page VO为借鉴而来。
心得:
分页不难,但还是会出现bug,需要好好调试。可以通过打印Page&将所传的值在input标签显示方便调试。