通用分页之详解】

本文涉及的产品
云数据库 RDS SQL Server,基础系列 2核4GB
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 通用分页之详解】

1.通用分页的优势

1.简化代码

:Java中通用的分页工具类可以集成到项目中,避免每个分页查询都需要手动编写分页代码,可以减少重复代码的编写量。

2.可维护性

:使用通用的分页工具类可以使代码更加可维护,当需要改变分页参数时,只需要修改分页工具类,而不需要修改每个分页查询代码。

3.可移植性

:通用分页工具类可以应用于不同的数据库和ORM框架,具有较强的可移植性。

4更高的效率

:通用的分页工具类可以通过封装分页参数,减少分页查询的重复代码量,提高代码执行效率。

5.良好的扩展性

:使用通用的分页工具类可以支持更多的分页参数设置,例如默认分页大小、最大分页大小、排序规则等。

2.反射完成通用查询功能

1.实体类

package com.niyin.entity;
public class Book {
  private int bid;
  private String bname;
  private float price;
  @Override
  public String toString() {
    return "Book [bid=" + bid + ", bname=" + bname + ", price=" + price + "]";
  }
  public int getBid() {
    return bid;
  }
  public void setBid(int bid) {
    this.bid = bid;
  }
  public String getBname() {
    return bname;
  }
  public void setBname(String bname) {
    this.bname = bname;
  }
  public float getPrice() {
    return price;
  }
  public void setPrice(float price) {
    this.price = price;
  }
}

1.定义分页工具类

package com.niyin.util;
/**
 * 分页工具类
 *
 */
public class PageBean {
  private int page = 1;// 页码
  private int rows = 10;// 页大小
  private int total = 0;// 总记录数
  private boolean pagination = true;// 是否分页
  public PageBean() {
    super();
  }
  public int getPage() {
    return page;
  }
  public void setPage(int page) {
    this.page = page;
  }
  public int getRows() {
    return rows;
  }
  public void setRows(int rows) {
    this.rows = rows;
  }
  public int getTotal() {
    return total;
  }
  public void setTotal(int total) {
    this.total = total;
  }
  public void setTotal(String total) {
    this.total = Integer.parseInt(total);
  }
  public boolean isPagination() {
    return pagination;
  }
  public void setPagination(boolean pagination) {
    this.pagination = pagination;
  }
  /**
   * 获得起始记录的下标
   * 
   * @return
   */
  public int getStartIndex() {
    return (this.page - 1) * this.rows;
  }
  @Override
  public String toString() {
    return "PageBean [page=" + page + ", rows=" + rows + ", total=" + total + ", pagination=" + pagination + "]";
  }
}

3. 连接数据库帮助类

package com.niyin.util;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
/**
 * 提供了一组获得或关闭数据库对象的方法
 * 
 */
public class DBAccess {
  private static String driver;
  private static String url;
  private static String user;
  private static String password;
  static {// 静态块执行一次,加载 驱动一次
    try {
      InputStream is = DBAccess.class
          .getResourceAsStream("config.properties");
      Properties properties = new Properties();
      properties.load(is);
      driver = properties.getProperty("driver");
      url = properties.getProperty("url");
      user = properties.getProperty("user");
      password = properties.getProperty("pwd");
      Class.forName(driver);
    } catch (Exception e) {
      e.printStackTrace();
      throw new RuntimeException(e);
    }
  }
  /**
   * 获得数据连接对象
   * 
   * @return
   */
  public static Connection getConnection() {
    try {
      Connection conn = DriverManager.getConnection(url, user, password);
      return conn;
    } catch (SQLException e) {
      e.printStackTrace();
      throw new RuntimeException(e);
    }
  }
  public static void close(ResultSet rs) {
    if (null != rs) {
      try {
        rs.close();
      } catch (SQLException e) {
        e.printStackTrace();
        throw new RuntimeException(e);
      }
    }
  }
  public static void close(Statement stmt) {
    if (null != stmt) {
      try {
        stmt.close();
      } catch (SQLException e) {
        e.printStackTrace();
        throw new RuntimeException(e);
      }
    }
  }
  public static void close(Connection conn) {
    if (null != conn) {
      try {
        conn.close();
      } catch (SQLException e) {
        e.printStackTrace();
        throw new RuntimeException(e);
      }
    }
  }
  public static void close(Connection conn, Statement stmt, ResultSet rs) {
    close(rs);
    close(stmt);
    close(conn);
  }
  public static boolean isOracle() {
    return "oracle.jdbc.driver.OracleDriver".equals(driver);
  }
  public static boolean isSQLServer() {
    return "com.microsoft.sqlserver.jdbc.SQLServerDriver".equals(driver);
  }
  public static boolean isMysql() {
    return "com.mysql.cj.jdbc.Driver".equals(driver);
  }
  public static void main(String[] args) {
    Connection conn = DBAccess.getConnection();
    System.out.println(conn);
    DBAccess.close(conn);
    System.out.println("isOracle:" + isOracle());
    System.out.println("isSQLServer:" + isSQLServer());
    System.out.println("isMysql:" + isMysql());
    System.out.println("数据库连接(关闭)成功");
  }
}

4.定义bookdao

package Dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import com.niyin.entity.Book;
import com.niyin.util.DBAccess;
import com.niyin.util.PageBean;
import com.niyin.util.StringUtils;
public class BookDao {
  public List<Book> list(Book book,PageBean pageBean) throws Exception {
  List<Book>list=new ArrayList<Book>();
    Connection conn = DBAccess.getConnection();
    String sql="select * from t_mvc_book where 1=1 ";
    String bname = book.getBname();
    if (StringUtils.isNotBlank(bname)) {
      sql +=" and bname like '%"+bname+"%'";
    }
    PreparedStatement pst = conn.prepareStatement(sql);
    ResultSet rs = pst.executeQuery();
    while(rs.next()) {
      Book b=new Book();
      b.setBid(rs.getInt("bid"));
      b.setBname(rs.getString("bname"));
      b.setPrice(rs.getFloat("price"));
      list.add(b);
    }
    return list;
  }
  public static void main(String[] args) throws Exception {
    BookDao bookdao=new BookDao();
    Book book=new Book();
    book.setBname("圣墟");
    PageBean pageBean=new PageBean();
    List<Book> list = bookdao.list(book, pageBean);
    for (Book book2 : list) {
      System.out.println(book2);
    }
  }
}

5定义basedao

package com.niyin.util;
import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
public class BaseDao<T> {
  public List<T> executeQuery(String sql, PageBean pageBean, Class clz) throws Exception {
    List<T> lst = new ArrayList<T>();
    Connection conn = null;
    PreparedStatement pst = null;
    ResultSet rs = null;
    if (pageBean != null && pageBean.isPagination()) {
      String countSQL = getcountSQL(sql);
      conn = DBAccess.getConnection();
      pst = conn.prepareStatement(countSQL);
      rs = pst.executeQuery();
      if (rs.next()) {
        pageBean.setTotal(rs.getObject("n").toString());
      }
      String pageSQl = getpageSQl(sql, pageBean);
      conn = DBAccess.getConnection();
      pst = conn.prepareStatement(pageSQl);
      rs = pst.executeQuery();
    } else {
      conn = DBAccess.getConnection();
      pst = conn.prepareStatement(sql);
      rs = pst.executeQuery();
    }
    while (rs.next()) {
      T t = (T) clz.newInstance();
      Field[] fields = clz.getDeclaredFields();
      for (Field f : fields) {
        f.setAccessible(true);
        // System.out.println(f.getName());
        // rs.getObject(f.getName());
        f.set(t, rs.getObject(f.getName()));
      }
      lst.add(t);
      // Book b=new Book();
      // b.setBid(rs.getInt("bid"));
      // b.setBname(rs.getString("bname"));
      // b.setPrice(rs.getFloat("price"));
      // list.add(b);
    }
    return lst;
  }
  private String getpageSQl(String sql, PageBean pageBean) {
    return sql +=" limit " + pageBean.getStartIndex() + "," + pageBean.getRows();
  }
  private String getcountSQL(String sql) {
    return "select count(1) as n from ("+sql+") t";
  }
}

运行结果

数据库的资源我会放在我的资源,可以自行下载。

3通用分页查询

结合上面的代码和例子,只要修改bookdao即可

代码如下

1.Bookdao

package Dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import com.niyin.entity.Book;
import com.niyin.util.BaseDao;
import com.niyin.util.DBAccess;
import com.niyin.util.PageBean;
import com.niyin.util.StringUtils;
public class BookDao2 extends BaseDao<Book> {
//  public List<Book> list(Book book,PageBean pageBean) throws Exception {
//  List<Book>list=new ArrayList<Book>();
//    Connection conn = DBAccess.getConnection();
//    String sql="select * from t_mvc_book where 1=1";
//    String bname = book.getBname();
//    if (StringUtils.isNotBlank(bname)) {
//      sql +="and bname like '%"+bname+"%'";
//    }
//    PreparedStatement pst = conn.prepareStatement(sql);
//    ResultSet rs = pst.executeQuery();
//    while(rs.next()) {
//      Book b=new Book();
//      b.setBid(rs.getInt("bid"));
//      b.setBname(rs.getString("bname"));
//      b.setPrice(rs.getFloat("price"));
//      list.add(b);
//    }
//    return list;
//    
//  }
  public List<Book> list(Book book,PageBean pageBean) throws Exception {
    List<Book>list=new ArrayList<Book>();
      Connection conn = DBAccess.getConnection();
      String sql="select * from t_mvc_book where 1=1 ";
      String bname = book.getBname();
      if (StringUtils.isNotBlank(bname)) {
        sql +=" and bname like '%"+bname+"%'";
      }
      return super.executeQuery(sql, pageBean, Book.class);
    }
  public static void main(String[] args) throws Exception {
    BookDao2 bookdao=new BookDao2();
    Book book=new Book();
    PageBean pageBean=new PageBean();
    book.setBname("圣墟");
    List<Book> list = bookdao.list(book, pageBean);
    for (Book book2 : list) {
      System.out.println(book2);
    }
  }
}

结果如下

通过分页工具类,只取了前面10条数据。

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
目录
相关文章
|
Linux 网络架构
Linux 中查看本机的子网掩码和网关
Linux 中查看本机的子网掩码和网关
|
移动开发 缓存 JavaScript
2021最新阿里代码规范(前端篇)
2021最新阿里代码规范(前端篇)
56202 11
2021最新阿里代码规范(前端篇)
|
索引 存储 数据库
数据库设计规范
基于阿里数据库设计规范扩展而来
49370 4
|
6月前
|
安全 Windows
“由于启动计算机时出现了页面文件配置问题,Windows在你的计算机上创建了一个临时页面文件。。。”的问题解决
本文主要介绍了因清理电脑垃圾文件时误删虚拟内存导致的Windows页面文件配置问题,并提供了详细的解决步骤。问题表现为开机后出现临时页面文件创建的提示弹窗。解决方法包括通过控制面板或快捷键进入高级系统设置,进而调整虚拟内存设置:进入性能选项中的虚拟内存栏,选择自动管理所有驱动器的分页文件大小,最后确认并重启计算机以恢复正常运行。
4642 5
“由于启动计算机时出现了页面文件配置问题,Windows在你的计算机上创建了一个临时页面文件。。。”的问题解决
|
关系型数据库 MySQL Devops
docker容器刚启动就停止 — 运行mysql 报错 mysqld: [ERROR] Fatal error in defaults handling. Program aborted!
docker容器刚启动就停止 — 运行mysql 报错 mysqld: [ERROR] Fatal error in defaults handling. Program aborted!
2027 0
|
NoSQL Redis 数据库
Redis Windows版下载,带安装包
文章提供了Windows版Redis的下载和安装指南,包括如何解压、启动Redis服务以及连接到Redis数据库。
5382 0
Redis Windows版下载,带安装包
|
Java Spring
在Spring Boot中,可以通过控制`@PostConstruct`注解方法的执行顺序来实现初始化时的顺序控制
在Spring Boot中,可以通过控制`@PostConstruct`注解方法的执行顺序来实现初始化时的顺序控制
1012 1
|
存储 开发者 Docker
|
前端开发
若依修改,配置了一个接口路径出现了,如何放通接口{ “msg“: “请求访问:/code/list,认证失败,无法访问系统资源“, “code“: 401}
若依修改,配置了一个接口路径出现了,如何放通接口{ “msg“: “请求访问:/code/list,认证失败,无法访问系统资源“, “code“: 401}
|
SQL NoSQL 前端开发
MySQL 连接数过多的处理方法合集 - Too many connections - 卡拉云
碰到`Can not connect to MySQL server. Too many connections”-mysql`错误着实令人抓狂。这基本等于失去了对 MySQL 的控制权。本教程将详细讲解多种处理此错误的方法。 sudo mysql -uroot -p ERROR 1040 (00000): Too many connections
23321 1