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;
}