Java实现分页查询功能

下面是Java实现分页查询功能的完整攻略。

一、分页查询功能说明

分页查询功能是指在查询数据时,将要查询的数据分批返回给用户,每一批数据的大小为一页(page size),以此来减少查询时间和网络传输数据量。分页查询功能在实际开发中很常用,因此在Java中实现这个功能也非常重要。

二、Java实现分页查询功能的步骤

  1. 获取数据总量

在执行分页查询之前,需要先获取总数据量。可以从数据库中获取,或者从接口中获取。获取总数据量后,可以根据每页数据大小和总数据量计算出总页数。

  1. 实现查询方法

查询方法需要传入当前页数和每一页的数据量。可以使用SQL语句中的limit关键字来实现分页查询:

public List<User> findUsers(int currentPage, int pageSize) {
    String sql = "SELECT * FROM users LIMIT ?, ?";
    int start = (currentPage - 1) * pageSize;
    List<User> users = jdbcTemplate.query(sql, new Object[]{start, pageSize}, new UserRowMapper());
    return users;
}

其中 currentPage 是当前页数,pageSize 是每一页的数据量。UserRowMapper 是一个实现了 RowMapper 接口的类,用于将查询结果转换为 User 对象。

  1. 实现分页控制器

分页控制器是指一个可以接收用户请求,并返回符合用户请求的数据的控制器。可以使用 Spring MVC 中的 @RequestMapping 注解将请求映射到这个控制器。

@RequestMapping(value = "/users", method = RequestMethod.GET)
public ModelAndView getUsers(@RequestParam int page) {
    ModelAndView modelAndView = new ModelAndView("users");
    int pageSize = 10;
    int totalRows = userDao.count();
    int totalPages = (int) Math.ceil((double) totalRows / pageSize);
    List<User> users = userDao.findUsers(page, pageSize);
    modelAndView.addObject("users", users);
    modelAndView.addObject("currentPage", page);
    modelAndView.addObject("totalPages", totalPages);
    return modelAndView;
}

在这个方法中,使用 @RequestParam 注解从请求中获取 page 参数,然后调用 count 方法获取总数据量,再根据当前页数和每页数据量调用 findUsers 方法查询符合条件的数据。最后将查询结果和分页信息保存到 ModelAndView 对象中,并返回给用户。

三、示例说明

下面是使用Spring Boot和Thymeleaf模板引擎实现分页查询功能的例子。

  1. 创建一个Spring Boot项目,并添加依赖:
<dependencies>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
  </dependency>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
  </dependency>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
  </dependency>
  <dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
  </dependency>
  <dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper-spring-boot-starter</artifactId>
    <version>1.2.13</version>
  </dependency>
</dependencies>
  1. 创建一个 UserController 控制器类,并添加 @RequestMapping 注解:
@Controller
public class UserController {

  @Autowired
  private UserService userService;

  @RequestMapping(value = "/users", method = RequestMethod.GET)
  public String getUsers(@RequestParam(defaultValue = "1") int page, Model model) {
    int pageSize = 10;
    List<User> users = userService.findUsers(page, pageSize);
    PageInfo<User> pageInfo = new PageInfo<>(users);
    model.addAttribute("users", users);
    model.addAttribute("pageInfo", pageInfo);
    return "users";
  }
}

在这个控制器中,从请求中获取 page 参数,调用 findUsers 方法查询数据,并使用 PageInfo 对象保存分页信息,最后将查询结果和分页信息保存到 Model 对象中,并返回到 users.html 模板中渲染。

  1. 在模板文件 users.html 中使用分页组件:
<!DOCTYPE html>
<html>
  <head>
    <title>分页查询演示</title>
  </head>
  <body>
    <table>
      <thead>
        <tr>
          <th>ID</th>
          <th>姓名</th>
          <th>邮箱</th>
        </tr>
      </thead>
      <tbody>
        <tr th:each="user : ${users}">
          <td th:text="${user.id}"></td>
          <td th:text="${user.name}"></td>
          <td th:text="${user.email}"></td>
        </tr>
      </tbody>
    </table>
    <div>
      <ul>
        <li th:class="${pageInfo.hasPreviousPage()} ? '' : 'disabled'">
          <a th:href="@{/(page=${pageInfo.pageNum-1})}">上一页</a>
        </li>
        <li th:each="pageNum : ${pageInfo.navigatepageNums}">
          <a th:href="@{/(page=${pageNum})}" th:text="${pageNum}"></a>
        </li>
        <li th:class="${pageInfo.hasNextPage()} ? '' : 'disabled'">
          <a th:href="@{/(page=${pageInfo.pageNum+1})}">下一页</a>
        </li>
      </ul>
    </div>
  </body>
</html>

在这个模板文件中,使用 th:each 命令在表格中展示查询结果,并使用 PageInfo 对象展示分页信息,使用 th:class 命令判断上一页和下一页是否可用。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java实现分页查询功能 - Python技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • MySQL 视图、函数和存储过程详解

    MySQL 视图、函数和存储过程详解 在 MySQL 中,视图、函数和存储过程是三个重要的概念,它们都可以用来简化和优化 SQL 操作。本文将详细讲解这三个概念以及它们的用法,帮助读者更好地理解和应用它们。 视图(VIEW) 视图是一种虚拟的表,它是基于 SQL 查询结果的一张表,视图中的数据并不存储在数据库中,而是在查询结果的基础上进行展示。视图可以对多张…

    database 2023年5月22日
    00
  • 六分钟学会创建Oracle表空间的实现步骤

    下面是详细讲解“六分钟学会创建Oracle表空间的实现步骤”的完整攻略。 1. 准备工作 在开始创建Oracle表空间之前,需要先准备好以下基础工作: 已经安装Oracle数据库软件; 已经创建好了Oracle实例并启动; 已经以SYS用户登录到Oracle实例。 2. 创建表空间 创建表空间的语法如下所示: CREATE TABLESPACE 表空间名称 …

    database 2023年5月21日
    00
  • Linux服务器安装PHP MongoDB扩展的方法

    下面我来为您详细讲解“Linux服务器安装PHP MongoDB扩展的方法”的完整攻略。 安装PHP MongoDB扩展 1. 安装MongoDB驱动 在安装PHP MongoDB扩展之前,我们需要先安装MongoDB驱动。您可以通过终端执行以下命令安装: sudo apt-get install php-mongodb 安装成功后,您可以通过在PHP代码中…

    database 2023年5月22日
    00
  • oracle 数据库闪回相关语句介绍

    Oracle数据库闪回相关语句介绍 介绍 Oracle数据库闪回可以帮助在不影响数据库的情况下回滚表数据或整个数据库。它是自从Oracle 10g版本以来添加的特性。Oracle闪回的主要原理是利用UNDO数据存储机制将数据进行回滚。为了使用Oracle闪回,必须满足以下要求: 数据库必须在运行,并且UNDO表空间必须处于提供UNDO数据存储的状态。 需要访…

    database 2023年5月21日
    00
  • 浅谈MySQL大表优化方案

    浅谈MySQL大表优化方案 在使用MySQL时,随着数据量的逐渐增大,我们可能会面临MySQL大表的优化问题。本文将介绍几种常见的MySQL大表优化方案,以及相应的示例说明。 优化方案一:水平分表 水平分表是将一张大表拆分成多张小表,各个小表之间的结构完全相同,但是它们分别存储不同的数据。通过水平分表,可以将表的行数分散到多个物理表中,从而减少单张表的数据量…

    database 2023年5月19日
    00
  • 使用Redis缓存时高效的批量删除的几种方案

    使用Redis缓存时,批量删除是一个常见的需求。下面介绍几种可以高效删除Redis缓存的方案。 使用Redis的pipeline批量删除 Redis的pipeline是一种批量执行操作的技术。对于批量删除,可以将需要删除的key全部添加到pipeline中,使用一次pipeline执行删除操作,以提高删除效率。 代码示例: import redis # 创建…

    database 2023年5月22日
    00
  • MySQL删除和插入数据很慢的问题解决

    MySQL删除和插入数据很慢的问题是很常见的情况,有以下几个原因可能导致此问题: 硬件问题:慢磁盘、内存不足、CPU资源不够等; MySQL优化问题:MySQL配置项设置不合理,索引优化不到位等; 数据库设计问题:表结构设计不合理、表中数据量过大等。 为了解决MySQL删除和插入数据很慢的问题,我们可以采取以下措施。 硬件问题解决 对于硬件问题,我们可以通过…

    database 2023年5月22日
    00
  • MySQL函数date_format()日期格式转换的实现

    MySQL函数 date_format() 可以把日期时间类型的数据按照指定的格式进行转换和格式化,使其更符合我们需要展示的要求。 语法 DATE_FORMAT(date, format) 参数说明: date: 需要转换格式的日期/时间数据。 format: 转换后的日期/时间格式,可使用特定的格式控制符。 格式控制符 下面是常见的格式控制符: 格式控制符…

    database 2023年5月22日
    00
合作推广
合作推广
分享本页
返回顶部