分页查询简介

当一个操作数据库进行查询的语句返回的结果集内容如果过多,那么内存极有可能溢出,所以在查询中含有大数据的情况下分页是必须的。

分页查询分类:

  1. 物理分页:
    • 在数据库执行查询时(实现分页查询),查询需要的数据—依赖数据库的SQL语句
    • 在SQL查询时,从数据库只检索分页需要的数据
    • 通常不同的数据库有着不同的物理分页语句
    • MySql物理分页采用limit关键字
  2. 逻辑分页:
  • 在sql查询时,先从数据库检索出所有数据的结果集,在程序内,通过逻辑语句获得分页需要的数据

limit的使用
select from tableName limit m,n;
其中m与n为数字。n代表需要获取多少行的数据项,而m代表从哪开始(以0为起始)。
分页公式:(当前页-1)
每页大小

创建Page模型

image.png

  1. import java.util.List;
  2. /**
  3. * 分页查询实体类
  4. * @param <T>
  5. */
  6. public class Page<T> {
  7. //当前页
  8. private int currentPage;
  9. //每页显示的条数
  10. private int pageSize;
  11. //总条数
  12. private int totalCount;
  13. //总页数
  14. private int totalPage;
  15. //结果集
  16. private List<T> result;
  17. public int getCurrentPage() {
  18. return currentPage;
  19. }
  20. public void setCurrentPage(int currentPage) {
  21. this.currentPage = currentPage;
  22. }
  23. public int getPageSize() {
  24. return pageSize;
  25. }
  26. public void setPageSize(int pageSize) {
  27. this.pageSize = pageSize;
  28. }
  29. public int getTotalCount() {
  30. return totalCount;
  31. }
  32. public void setTotalCount(int totalCount) {
  33. this.totalCount = totalCount;
  34. }
  35. public int getTotalPage() {
  36. return totalPage;
  37. }
  38. public void setTotalPage(int totalPage) {
  39. this.totalPage = totalPage;
  40. }
  41. public List<T> getResult() {
  42. return result;
  43. }
  44. public void setResult(List<T> result) {
  45. this.result = result;
  46. }
  47. }

实现分页查询

  1. import java.sql.Connection;
  2. import java.sql.PreparedStatement;
  3. import java.sql.ResultSet;
  4. import java.util.ArrayList;
  5. import java.util.List;
  6. public class PageTest {
  7. /**
  8. * 分页查询users
  9. */
  10. public Page<Users> selectPage(Page page){
  11. Connection connection = null;
  12. PreparedStatement preparedStatement = null;
  13. ResultSet resultSet = null;
  14. List<Users> list = new ArrayList<>();
  15. try{
  16. connection = JDBCUtils.getConnection();
  17. preparedStatement = connection.prepareStatement("select * from users limit ?,?");
  18. preparedStatement.setInt(1,(page.getCurrentPage()-1)*page.getPageSize());
  19. preparedStatement.setInt(2,page.getCurrentPage());
  20. resultSet=preparedStatement.executeQuery();
  21. while(resultSet.next()){
  22. Users users = new Users();
  23. users.setUserid(resultSet.getInt("userid"));
  24. users.setUsername(resultSet.getString("username"));
  25. users.setUserage(resultSet.getInt("userage"));
  26. list.add(users);
  27. }
  28. //将结果集存放在Page对象中
  29. page.setResult(list);
  30. //查询总条数
  31. preparedStatement = connection.prepareStatement("select count(*) from users");
  32. resultSet=preparedStatement.executeQuery();
  33. while (resultSet.next()){
  34. //总条数
  35. int count=resultSet.getInt(1);
  36. //保存总条数
  37. page.setTotalCount(count);
  38. //换算总页数=总条数/每页展示条数
  39. int totalPage =(int) Math.ceil(1.0*count/page.getPageSize());
  40. //保存总页数
  41. page.setTotalPage(totalPage);
  42. }
  43. }catch (Exception e){
  44. e.printStackTrace();
  45. }finally {
  46. JDBCUtils.clossResource(resultSet,preparedStatement,connection);
  47. }
  48. return page;
  49. }
  50. public static void main(String[] args) {
  51. PageTest pageTest = new PageTest();
  52. Page page = new Page();
  53. page.setCurrentPage(2);
  54. page.setPageSize(2);
  55. Page page1 = pageTest.selectPage(page);
  56. System.out.println("总条数:"+page1.getTotalCount());
  57. System.out.println("总页数:"+page1.getTotalPage());
  58. System.out.println("当前页:"+page1.getCurrentPage());
  59. System.out.println("每页展示条数:"+page1.getPageSize());
  60. List<Users> list = page1.getResult();
  61. for(Users user:list){
  62. System.out.println(user.getUserid()+" "+user.getUsername()+" "+user.getUserage());
  63. }
  64. }
  65. }