[drp 5] pageModel的建立,实现分页查询

来源:互联网 发布:免费com域名 编辑:程序博客网 时间:2024/05/21 22:37

导读:之前做的分页,一直都是用的easy——UI分页,然后没有系统的整理过,就是知道传几个参数,然后云云。这次,从头到尾总结一下,了了我的这桩心愿。人事系统的重定向工作,一直刺激着我一定要总结总结这个分页。嗯,是这样的!


一、建立分页Model类

在这个类中,包含了几个基本的信息;总页数、总记录数、上一页、下一页、页容量等。这些配置,之前都是easy-UI 的一些属性,现在自己进行建立。这个类,在本篇博客中,没有用到。它的主要作用,在前台点击上一页、下一页、第一页、最后一页时获取参数值。

<span style="font-family:KaiTi_GB2312;font-size:18px;">package com.angel.drp.util;import java.util.List;/** * 封装分页信息 * @author AngelHHX * */public class PageModel<E> {//结果集private List<E> list;//查询记录数private int totalRecords;//每页多少条数据private int pageSize;//第几页private int pageNo;/** * 总页数 * @return */public int getTotalPages() {return (totalRecords + pageSize - 1) / pageSize;}/** * 取得首页 * @return */public int getTopPageNo() {return 1;}/** * 上一页 * @return */public int getPreviousPageNo() {if (pageNo <= 1) {return 1;}return pageNo - 1;}/** * 下一页 * @return */public int getNextPageNo() {if (pageNo >= getBottomPageNo()) {return getBottomPageNo();}return pageNo + 1;}/** * 取得尾页 * @return */public int getBottomPageNo() {return getTotalPages();}public List<E> getList() {return list;}public void setList(List<E> 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>

二、实现分页查询

<span style="font-family:KaiTi_GB2312;font-size:18px;">/** * 分页查询 * @param pageNo 第几页 * @param pageSize 每页多少条数据 * @return */public PageModel<User> fundUserList(int pageNo,int pageSize){StringBuffer sbSql=new StringBuffer();sbSql.append("select user_id, user_name, password, contact_tel, email, create_date ").append("from ").append("( ").append("select rownum rn, user_id, user_name, password, contact_tel, email, create_date ").append("from ").append("( ").append("select user_id, user_name, password, contact_tel, email, create_date from t_user where user_id <> 'root' order by user_id ").append(")  where rownum <= ? ").append(")  where rn > ? ");Connection conn=null;PreparedStatement pstmt=null;ResultSet rs=null;PageModel<User> pageModel=null;try {conn=DbUtil.getConnection();pstmt=conn.prepareStatement(sbSql.toString());pstmt.setInt(1, pageNo*pageSize);pstmt.setInt(2, (pageNo-1)*pageSize);rs=pstmt.executeQuery();List<User> userList=new ArrayList<User>();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.setCreateDate(rs.getTimestamp("create_date"));user.setEmail(rs.getString("email"));userList.add(user);}pageModel =new PageModel<User>();pageModel.setList(userList);pageModel.setTotalRecords(getTotalRecords(conn));pageModel.setPageNo(pageNo);pageModel.setPageSize(pageSize);} catch (Exception e) {e.printStackTrace();}finally{DbUtil.close(rs);DbUtil.close(pstmt);DbUtil.close(conn);}return pageModel;}</span>

要点:主要是三层SQL语句的嵌套。最里边的一层:select user_id, user_name, password, contact_tel, email, create_date from t_user where user_id <> 'root' order by user_id 是从表中获取需要的数据;第二层:则是用rownum 给查询出来的数据编号;最外边的一层,则是根据传过来的参数,选择合适编号的数据。

这样子,在前台,只需要传过来第几页和页容量就行了。


三、总结和重定向的思考

在人事系统中,所用到的修改重定向或是添加重定向,都可以从这个分页查询中,窥探出一二来,最开始的时候,是因为对这个分页的逻辑不明白,一旦明白了这一点,就显得比较容易了。

如果要进行重定向(编辑),那么应该有以下几个要点;

1,获取目前的总记录数;2,获取当前记录在数据库中所在的位置;3,获取页容量。那么根据分页的逻辑和算法,可以得出:总页数,当前记录所在的页码。这样子,就可以进行重定向了。下面是获取当前记录的所在位置代码:

<span style="font-family:KaiTi_GB2312;font-size:18px;">select num from(SELECTrow_number () OVER (ORDER BY[排序字段] DESC) AS num ,*FROM[表单名称] pWHEREp.state = 'T') x where [当前记录的限制字段]=[字段值]</span>


0 0
原创粉丝点击