分页查询

    分页查询其实和其他的没什么区别,主要区别在一个地方,就是查询语句不通,分页查询可能比较麻烦一点,下面来说一下该如何实现我们的分页查询功能:

一、代码展示
    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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值