分页操作Java web

1.分页

分页是为了解决数据一次性加载的问题。如果数据库的数据达到了几千条是否要一次性全部显示出来?从两个方面上说是不可以的

此时,就可以考虑使用分页处理。分页实际上就是 将数据平分到不同的页面中。给用户提供对应的页码链 接,点击时,可以切换当前页的数据。

1.2 页面分类

  • 分页

    将数据一次性读取到内存中,通过 ResultSet的相关方法,例如向上或向下 的操作,实现分页效果
    兼容性比较强
    性能较差
  • 分页

    利用数据库自身的sql特性实现的分页效 果。例如MysqL中使用Limit,在sql SERVER采用top结合子查询实现,在 oracle中使用rownum伪列实现,同样也 需要结合子查询
    兼容性差
    查询速度较快

1.3 分页的实现

1.3.1 建立一个通用的处理分页的类

public class PageInfo<T> {
    //装载所有数据
    private List<T> list;
    //当前页
    private int currentsPageNo;
    //每页显示条数
    private int perPageNo;
    //总共页数
    private int totalPageNo;
    //总计条数
    private int totalRecords;
    //计算上一页
    public int getPreviewPageNo(){
        return currentsPageNo <= 1? 1:currentsPageNo-1;
    }
    //计算下一页
    public int getNextPageNo(){
        return currentsPageNo >=totalPageNo ? totalPageNo:currentsPageNo+1;
    }
    public List<T> getList() {
        return list;
    }

    public void setList(List<T> list) {
        this.list = list;
    }

    public int getCurrentsPageNo() {
        return currentsPageNo;
    }

    public void setCurrentsPageNo(int currentsPageNo) {
        this.currentsPageNo = currentsPageNo;
    }

    public int getPerPageNo() {
        return perPageNo;
    }

    public void setPerPageNo(int perPageNo) {
        this.perPageNo = perPageNo;
    }

    public int getTotalPageNo() {
        return totalPageNo;
    }

    public void setTotalPageNo(int totalPageNo) {
        this.totalPageNo = totalPageNo;
    }

    public int getTotalRecords() {
        return totalRecords;
    }
    //计算总页数
    public void setTotalRecords(int totalRecords) {
        this.totalRecords = totalRecords;
        int num=totalRecords % perPageNo ==0 ? totalRecords / perPageNo:totalRecords / perPageNo+1;
        setTotalPageNo(num);
    }
}

 1.3.2 重构dao

在原有的dao中,采用的是ArrayList作为返回值对 象,由于需要相应的数据和分页信息,所以返回值要改 为PageInfo。

public PageInfo<Student> list(PageInfo pageInfo) throws sqlException {
    String sql = "SELECT * FROM student LIMIT ?,?" ;
    Connection connection =this.getConnection();
    PreparedStatement ps =connection.prepareStatement(sql) ;
    //设置分页的两个数值
    ps.setInt(1,(pageInfo.getCurrentPageNO() - 1) *pageInfo.getPerPageNO());
    ps.setInt(2,pageInfo.getPerPageNO());
    ResultSet rs =ps.executeQuery();
    List<Student> students = new ArrayList<>() ;
    while(rs.next()) {
    //步骤1:需要建立学生信息
    Student student = new Student() ;
    student.setIdentityCard(rs.getString("IdentityCard"));
    student.setStudentName(rs.getString("StudentName"));
    student.setStudentNO(rs.getInt("StudentNO"));
    student.setLoginPwd(rs.getString("LoginPwd"));
    student.setAddress(rs.getString("Address"));
    student.setPhone(rs.getString("Phone"));
    student.setEmail(rs.getString("Email"));
    student.setSex(rs.getString("sex"));
    student.setBorndate(rs.getDate("Borndate"));
    //步骤2:建立年级信息
    GradeDao gradeDao = newGradeDaoImpl() ;
    Grade grade =gradeDao.findById(rs.getInt("gradeId"));
    //步骤3:建立学生与年级之间的映射关系
    student.setGrade(grade);
    students.add(student) ;
    }
    //封装对象
    pageInfo.setList(students);
    //计算总页数
    sql = "SELECT COUNT(*) FROM student" ;
    ps =connection.prepareStatement(sql) ;
    rs = ps.executeQuery() ;
    //获取查询的总记录数
    int ret = 0 ;
    if(rs.next()) {
    ret = rs.getInt(1) ;
    }
    pageInfo.setTotalRecords(ret);
    this.release(rs,ps,connection);
    return pageInfo;
}
  • 首先从PageInfo中,获取到当前页和每页显示条 数的数据
  • 查询会会返回所有查询到的数据,封装为一个 List集合,并且将集合放置在PageInfo对象中。
  • 之后计算总页数,所以先要查询到总的记录条数
  • 然后,将查询到的结果放置在了 setTotalRecords方法
  • 页面显示

相关文章

显卡天梯图2024最新版,显卡是电脑进行图形处理的重要设备,...
初始化电脑时出现问题怎么办,可以使用win系统的安装介质,连...
todesk远程开机怎么设置,两台电脑要在同一局域网内,然后需...
油猴谷歌插件怎么安装,可以通过谷歌应用商店进行安装,需要...
虚拟内存这个名词想必很多人都听说过,我们在使用电脑的时候...
win11本地账户怎么改名?win11很多操作都变了样,用户如果想要...