分页查询

来源:互联网 发布:java学员信息管理系统 编辑:程序博客网 时间:2024/06/16 19:03
    分页查询其实和其他的没什么区别,主要区别在一个地方,就是查询语句不通,分页查询可能比较麻烦一点,下面来说一下该如何实现我们的分页查询功能:

一、代码展示
    1、封装分页实体PageModel,保存一些分页查询的基本信息
    /**     * 封装分页信息     */</span>    public class PageModel {        //结果集</span>        private List list;        //查询记录数</span>        private int totalRecords;        //每页多少条数据</span>        private int pageSize;        //第几页</span>        private int pageNo;                //总页数</span>        public int getTotalPages(){                return (totalRecords+pageSize-1)/pageSize;        }        //取得首页</span>        public int getTopPageNo(){            return 1;        }        //取得尾页</span>        public int getButtomPageNo(){            return getTotalPages();        }        //上一页</span>        public int getPreviousPageNo(){            if (pageNo<=1){                return 1;            }            return pageNo-1;        }                //下一页</span>        public int getNextPageNo(){            if (pageNo>= getTotalPages()){                return getTotalPages();            }            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>
  2、编写分页查询方法
/**     * 分页查询     * @param pageNo 第几页     * @param pageSize 每页多少条数据     * @return pageMode     */    public PageModel findUserList(int pageNo,int pageSize){        //利用StringBuffer存放分页查询语句         StringBuffer sbSql=new StringBuffer();        sbSql.append("select user_id,user_name,password,contract_tel,email,create_date ")            .append("from ")            .append("( ")            .append("select ROWNUM rn,user_id,user_name,password,contract_tel,email,create_date ")            .append("from")            .append("( ")            .append("select * from T_USER where USER_ID<>'root' ORDER BY USER_ID ")            .append(") where ROWNUM <= ? ")            .append(") where rn > ? ");         //创建Connection对象和PreparedStatement对象        Connection conn=null;        PreparedStatement pstmt=null;         //创建ResultSet存放查询结果        ResultSet rs=null;        PageModel 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 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("CONTRACT_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);        }         //返回分页查询结果pageModel        return pageModel;    }    public int getTotalRecords(Connection conn) throws SQLException {        String sql="select count(*) from t_user where user_id <> 'root'";        PreparedStatement pstmt=null;        ResultSet rs=null;        int count=0;        try{            pstmt=conn.prepareStatement(sql);            rs=pstmt.executeQuery();            rs.next();            count=rs.getInt(1);        }finally{            DbUtil.close(rs);            DbUtil.close(pstmt);        }        return count;    }  

二、功能分析
        综合上面的东西,其实分页查询本质上就是一个查询语句的事:
       第三部分表3--开始
         select user_id,user_name,password,contract_tel,email,create_date from
(  
    第二部分表2--开始
select ROWNUM rn,user_id,user_name,password,contract_tel,email,create_date from
(
        第一部分表1---开始
select * from T_USER where USER_ID<>'root' ORDER BY USER_ID
                第一部分表1---结束
)where ROWNUM <= pageNo * pageSize
   第二部分表2--结束
) where rn > (pageNo-1)*pageSize
第三部分表3--结束
    

三、总结:由上面可知,分页查询其实就是表的嵌套查询,第一步:先将要查询的内容查出来,如第一部分;第二步:在去掉大于最大记录的那部分记录,如第二部分;第三步:在将小于最小记录的那部分去掉,如第三部分。掐头去尾,剩下的正好是我们所需要的分页查询数据。


2 0