下面是Java实现分页查询功能的完整攻略。
一、分页查询功能说明
分页查询功能是指在查询数据时,将要查询的数据分批返回给用户,每一批数据的大小为一页(page size),以此来减少查询时间和网络传输数据量。分页查询功能在实际开发中很常用,因此在Java中实现这个功能也非常重要。
二、Java实现分页查询功能的步骤
- 获取数据总量
在执行分页查询之前,需要先获取总数据量。可以从数据库中获取,或者从接口中获取。获取总数据量后,可以根据每页数据大小和总数据量计算出总页数。
- 实现查询方法
查询方法需要传入当前页数和每一页的数据量。可以使用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
对象。
- 实现分页控制器
分页控制器是指一个可以接收用户请求,并返回符合用户请求的数据的控制器。可以使用 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模板引擎实现分页查询功能的例子。
- 创建一个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>
- 创建一个
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
模板中渲染。
- 在模板文件
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技术站