• java通用分页


    目录

    一,PageBean

    二,反射通用后台查询方法

    三,通用的分页后台查询方法

    四,junit4


    前言:通用分页的原意义:能够简化分页相关功能的开发
    目的:极大优化代码

     

    分页代码比较:


    原有的分页代码:
    1.存在大量重复分页条的HTML代码
    2.将上一次的查询条件带到下一次,隐藏的from表单HTML
    3.后台有大量的代码是重复的

    1.按原始方式写一个查询
    存在问题:①有重复代码
    ②分页参数不清晰
    解决方案:①baseDao  ②pagebean

    2.BaseDao
    存在问题:
    不同人调用,处理resultset方式是不一样的

    解决方案:通过回调函数解决 callback

    3.callback

    4.通用分页
    原始SQL:调用方拼装好的sql
    分页sql:页面要展示数据的sql,第N也的数据
    符合条件的总记录数sql:时为了拿到总录数,计算总页数

    一,PageBean

    首先把该有的文件放到util包里面

    <如图所示>

    分析:DBAccess为数据库辅助类

    EncodingFiter为中文乱码处理

    PageBean为分页的工具类

    StringUtils为判空

    1.为什么封装

    方便使用

    2.封装的优点

    精简代码

    《代码演示》

    1. package com.dengxiyan.util;
    2. /**
    3. * 分页工具类
    4. *
    5. */
    6. public class PageBean {
    7. private int page = 1;// 页码
    8. private int rows = 10;// 页大小
    9. private int total = 0;// 总记录数
    10. private boolean pagination = true;// 是否分页
    11. public PageBean() {
    12. super();
    13. }
    14. public int getPage() {
    15. return page;
    16. }
    17. public void setPage(int page) {
    18. this.page = page;
    19. }
    20. public int getRows() {
    21. return rows;
    22. }
    23. public void setRows(int rows) {
    24. this.rows = rows;
    25. }
    26. public int getTotal() {
    27. return total;
    28. }
    29. public void setTotal(int total) {
    30. this.total = total;
    31. }
    32. public void setTotal(String total) {
    33. this.total = Integer.parseInt(total);
    34. }
    35. public boolean isPagination() {
    36. return pagination;
    37. }
    38. public void setPagination(boolean pagination) {
    39. this.pagination = pagination;
    40. }
    41. /**
    42. * 获得起始记录的下标
    43. *
    44. * @return
    45. */
    46. public int getStartIndex() {
    47. return (this.page - 1) * this.rows;
    48. }
    49. @Override
    50. public String toString() {
    51. return "PageBean [page=" + page + ", rows=" + rows + ", total=" + total + ", pagination=" + pagination + "]";
    52. }
    53. }

    二,反射通用后台查询方法

    《代码演示》

    BaseDao反射类

    1. package com.dengxiyan.util;
    2. import java.sql.Connection;
    3. import java.sql.PreparedStatement;
    4. import java.sql.ResultSet;
    5. import java.util.ArrayList;
    6. import java.util.List;
    7. import com.dengxiyan.entity.Book;
    8. /**
    9. * T代表的是实体类,可以是book/user/...
    10. * @author DXY
    11. *
    12. * @param <T>2022年6月21日下午7:31:26
    13. */
    14. public class BaseDao<T> {
    15. /*public List<T> executeQuery(String sql,PageBean pageBean,CallBack<T> callBack) throws Exception{
    16. // SELECT * FROM 'tb_book' WHERE bname like '%哈哈哈%';
    17. //从上面得到SELECT COUNT(1) as n FROM (SELECT * FROM tb_book WHERE bname LIKE '%哈哈哈%') t;
    18. //目的是为了得到总记录数---->总目的是得到总页数
    19. *//**
    20. * 1.拿到数据库连接
    21. * 2.拿到preparstatement
    22. * 3.执行sql语句
    23. *//*
    24. Connection con = DBAccess.getConnection();//重复代码1
    25. PreparedStatement ps = con.prepareStatement(sql);//重复代码2
    26. ResultSet rs = ps.executeQuery();//重复代码3
    27. while(rs.next()) {
    28. ls.add(new Book(rs.getInt(bid),rs.getString("bname"),rs.getFloat("price")));
    29. }
    30. //查询不同的表,必然要处理不同的结果集
    31. //接口是调用方实现
    32. return callBack.foreach(rs);
    33. }*/
    34. public List<T> executeQuery(String sql,PageBean pageBean,CallBack<T> callBack) throws Exception{
    35. // SELECT * FROM 'tb_book' WHERE bname like '%哈哈哈%';
    36. //从上面得到SELECT COUNT(1) as n FROM (SELECT * FROM tb_book WHERE bname LIKE '%哈哈哈%') t;
    37. //目的是为了得到总记录数---->总目的是得到总页数
    38. /**
    39. * 1.拿到数据库连接
    40. * 2.拿到preparstatement
    41. * 3.执行sql语句
    42. */
    43. Connection con = null;//重复代码1
    44. PreparedStatement ps = null;//重复代码2
    45. ResultSet rs = null;//重复代码3
    46. if(pageBean !=null && pageBean.isPagination()) {
    47. String countSql = getCountSql(sql);
    48. con = DBAccess.getConnection();//重复代码1
    49. ps = con.prepareStatement(countSql);//重复代码2
    50. rs = ps.executeQuery();//重复代码3
    51. if(rs.next()) {
    52. //因为下面Sql语句里有个n 将n放进以下代码
    53. //pageBean(当前实体类)就包含了总记录数
    54. pageBean.setTotal(rs.getString("n"));
    55. }
    56. String pageSql = getpageSql(sql,pageBean);
    57. con = DBAccess.getConnection();//重复代码1
    58. ps = con.prepareStatement(pageSql);//重复代码2
    59. rs = ps.executeQuery();//重复代码3
    60. }
    61. else {
    62. con = DBAccess.getConnection();//重复代码1
    63. ps = con.prepareStatement(sql);//重复代码2
    64. rs = ps.executeQuery();//重复代码3
    65. }
    66. return callBack.foreach(rs);
    67. }
    68. /**
    69. * 拼装第n页的数据的sql
    70. * @return
    71. */
    72. private String getpageSql(String sql,PageBean pageBean) {
    73. // TODO Auto-generated method stub
    74. return sql + " limit "+pageBean.getStartIndex() + ","+pageBean.getRows();
    75. }
    76. /**
    77. * 拼装符合条件总记录数的sql
    78. * @param sql
    79. * @return
    80. */
    81. private String getCountSql(String sql) {
    82. // TODO Auto-generated method stub
    83. return "select count(1) as n from ("+sql+") t";
    84. }
    85. }

     在实体类的数据访问层继承BaseDao(反射类)

    《代码演示》

    代码分析:

    如果没有bname的值,此处的sql语句也没条件,执行时固然会报错,所以以上sql语句要加where 1=1
                sql += " and bid =" +bid;

    所以下面的这条sql语句要加上where 1=1 ,这样不管放哪个条件都不会报错
            String sql = "select * from tb_book where 1=1 ";

    1. package com.dengxiyan.dao;
    2. import java.sql.Connection;
    3. import java.sql.PreparedStatement;
    4. import java.sql.ResultSet;
    5. import java.sql.SQLException;
    6. import java.util.ArrayList;
    7. import java.util.Comparator;
    8. import java.util.List;
    9. import java.util.TreeSet;
    10. import com.dengxiyan.entity.Book;
    11. import com.dengxiyan.util.BaseDao;
    12. import com.dengxiyan.util.DBAccess;
    13. import com.dengxiyan.util.PageBean;
    14. import com.dengxiyan.util.StringUtils;
    15. public class BookDao extends BaseDao<Book>{
    16. /**
    17. * 以前阶段版本
    18. * @param book
    19. * @param pageBean
    20. * @return
    21. * @throws Exception
    22. */
    23. public List<Book> list(Book book,PageBean pageBean) throws Exception{
    24. List<Book> list = new ArrayList<Book>();
    25. /**
    26. * 1.拿到数据库连接
    27. * 2.拿到preparstatement
    28. * 3.执行sql语句
    29. */
    30. Connection con = DBAccess.getConnection();//重复代码1
    31. String sql = "select * from tb_book where 1=1 ";
    32. String bname = book.getBname();
    33. //isNotBlank(bname)不为空
    34. if(StringUtils.isNotBlank(bname)) {
    35. sql +=" and bname like '%"+bname+"%'";
    36. }
    37. int bid = book.getBid();
    38. //int类型的默认值为0
    39. if(bid!=0) {
    40. sql += " and bid =" +bid;
    41. }
    42. PreparedStatement ps = con.prepareStatement(sql);//重复代码2
    43. ResultSet rs = ps.executeQuery();//重复代码3
    44. while(rs.next()) {
    45. list.add(new Book(rs.getInt(bid),rs.getString("bname"),rs.getFloat("price")));
    46. }
    47. return list;
    48. }
    49. /**
    50. * 后期阶段第一版本
    51. * @param book
    52. * @param pageBean
    53. * @return
    54. * @throws Exception
    55. */
    56. public List<Book> list2(Book book,PageBean pageBean) throws Exception{
    57. List<Book> ls = new ArrayList<Book>();
    58. /**
    59. * 1.拿到数据库连接
    60. * 2.拿到preparstatement
    61. * 3.执行sql语句
    62. */
    63. String sql = "select * from tb_book where 1=1 ";
    64. String bname = book.getBname();
    65. if(StringUtils.isNotBlank(bname)) {
    66. sql +=" and bname like '%"+bname+"%'";
    67. }
    68. int bid = book.getBid();
    69. if(bid!=0) {
    70. sql += " and bid =" +bid;
    71. }
    72. TreeSet<String> treeSet = new TreeSet<String>((x,y)->{
    73. return x.compareTo(y);
    74. });
    75. /**
    76. * 简单方式
    77. */
    78. return super.executeQuery(sql, pageBean, rs ->{
    79. List<Book> list = new ArrayList<Book>();
    80. try {
    81. while(rs.next()) {
    82. ls.add(new Book(rs.getInt(bid),rs.getString("bname"),rs.getFloat("price")));
    83. }
    84. } catch (SQLException e) {
    85. // TODO Auto-generated catch block
    86. e.printStackTrace();
    87. }
    88. return list;
    89. });
    90. }
    91. //增删改查junit
    92. // public static void main(String[] args) throws Exception {
    93. // List<Book> list = new BookDao().list(new Book(), null);
    94. // for (Book book : list) {
    95. // System.out.println(book);
    96. // }
    97. // }
    98. }

    《效果图》

     前期编码版本效果图

     

    三,通用的分页后台查询方法

    《代码演示》

    1. package com.dengxiyan.util;
    2. import java.sql.Connection;
    3. import java.sql.PreparedStatement;
    4. import java.sql.ResultSet;
    5. import java.util.ArrayList;
    6. import java.util.List;
    7. import com.dengxiyan.entity.Book;
    8. /**
    9. * T代表的是实体类,可以是book/user/...
    10. * @author DXY
    11. *
    12. * @param <T>2022年6月21日下午7:31:26
    13. */
    14. public class BaseDao<T> {
    15. public List<T> executeQuery(String sql,PageBean pageBean,CallBack<T> callBack) throws Exception{
    16. // SELECT * FROM 'tb_book' WHERE bname like '%哈哈哈%';
    17. //从上面得到SELECT COUNT(1) as n FROM (SELECT * FROM tb_book WHERE bname LIKE '%哈哈哈%') t;
    18. //目的是为了得到总记录数---->总目的是得到总页数
    19. /**
    20. * 1.拿到数据库连接
    21. * 2.拿到preparstatement
    22. * 3.执行sql语句
    23. */
    24. Connection con = null;//重复代码1
    25. PreparedStatement ps = null;//重复代码2
    26. ResultSet rs = null;//重复代码3
    27. if(pageBean !=null && pageBean.isPagination()) {
    28. String countSql = getCountSql(sql);
    29. con = DBAccess.getConnection();//重复代码1
    30. ps = con.prepareStatement(countSql);//重复代码2
    31. rs = ps.executeQuery();//重复代码3
    32. if(rs.next()) {
    33. //因为下面Sql语句里有个n 将n放进以下代码
    34. //pageBean(当前实体类)就包含了总记录数
    35. pageBean.setTotal(rs.getString("n"));
    36. }
    37. String pageSql = getpageSql(sql,pageBean);
    38. con = DBAccess.getConnection();//重复代码1
    39. ps = con.prepareStatement(pageSql);//重复代码2
    40. rs = ps.executeQuery();//重复代码3
    41. }
    42. else {
    43. con = DBAccess.getConnection();//重复代码1
    44. ps = con.prepareStatement(sql);//重复代码2
    45. rs = ps.executeQuery();//重复代码3
    46. }
    47. return callBack.foreach(rs);
    48. }
    49. /**
    50. * 拼装第n页的数据的sql
    51. * @return
    52. */
    53. private String getpageSql(String sql,PageBean pageBean) {
    54. // TODO Auto-generated method stub
    55. return sql + " limit "+pageBean.getStartIndex() + ","+pageBean.getRows();
    56. }
    57. /**
    58. * 拼装符合条件总记录数的sql
    59. * @param sql
    60. * @return
    61. */
    62. private String getCountSql(String sql) {
    63. // TODO Auto-generated method stub
    64. return "select count(1) as n from ("+sql+") t";
    65. }
    66. }

    《效果图》

     

    四,junit4

    就相当于一个测试类

     创建方式如下:

    勾选 Junit4

     

     

    根据实际情况勾选

     

    《代码演示》 

    1. package com.dengxiyan.dao;
    2. import static org.junit.Assert.*;
    3. import java.util.List;
    4. import org.junit.After;
    5. import org.junit.Before;
    6. import org.junit.Test;
    7. import com.dengxiyan.entity.Book;
    8. import com.dengxiyan.util.PageBean;
    9. /**
    10. * 作用:
    11. * 能够针对单个方法进行测试,相对于main方法而言,测试耦合性降低了
    12. * @author DXY
    13. *2022年6月21日下午7:25:52
    14. */
    15. public class BookDaoTest {
    16. /**
    17. * 调用以下两个方法与 @Before @After这两个注解有关,与方法名无关
    18. * @throws Exception
    19. */
    20. @Before
    21. public void setUp() throws Exception {
    22. System.out.println("被测试方法执行之前调用");
    23. }
    24. @After
    25. public void tearDown() throws Exception {
    26. System.out.println("被测试方法执行之后调用");
    27. }
    28. @Test
    29. public void testList() {
    30. List<Book> ls;
    31. try {
    32. ls = new BookDao().list(new Book(), null);
    33. for (Book book : ls) {
    34. System.out.println(book);
    35. }
    36. } catch (Exception e) {
    37. // TODO Auto-generated catch block
    38. e.printStackTrace();
    39. }
    40. }
    41. public void testList2() {
    42. List<Book> ls;
    43. try {
    44. ls = new BookDao().list2(new Book(), null);
    45. for (Book book : ls) {
    46. System.out.println(book);
    47. }
    48. } catch (Exception e) {
    49. // TODO Auto-generated catch block
    50. e.printStackTrace();
    51. }
    52. System.out.println("测试代码2");
    53. }
    54. public void testList3() {
    55. List<Book> ls;
    56. try {
    57. Book b = new Book();
    58. //加条件
    59. b.setBname("圣墟");
    60. PageBean pageBean = new PageBean();
    61. pageBean.setPage(3);
    62. pageBean.setRows(20);
    63. ls = new BookDao().list2(b, pageBean);
    64. for (Book book : ls) {
    65. System.out.println(book);
    66. }
    67. } catch (Exception e) {
    68. // TODO Auto-generated catch block
    69. e.printStackTrace();
    70. }
    71. System.out.println("测试代码2");
    72. }
    73. }

    《运行效果图》 

     

     

     

  • 相关阅读:
    #FreeRTOS延时函数
    七客咖啡50店齐开,拓展咖啡赛道
    值得反复研读的表连接之HASH JOIN方式
    Android不同设备字符串显示原理和build.prop生成过程
    BIM轻量化技术简介
    go方法集
    Redis(消息队列Stream)
    【C语法学习】20 - 文件访问顺序
    STP生成树协议详解
    职场人如何高效备考PMP?(建议收藏)
  • 原文地址:https://blog.csdn.net/weixin_66202611/article/details/125405523