春季 JDBC 没有任何内置操作来支持分页和排序。这是有关如何使用 Jdbc 模板实现分页和排序的快速指南,其中包含示例。
1. 依赖关系
在pom.xml
中添加spring-data-commons
依赖项。 spring-data-commons
提供了与分页和排序相关的类。
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-commons</artifactId>
</dependency>
2. Jdbc模板分页和排序示例
对于排序,我们需要为查询提供列属性和顺序方向。对于排序,查询如下所示:
SELECT * FROM USER ORDER BY USERNAME DESC;
1. 仅排序示例
@Repository
public class UserJdbcTemplate {
@Autowired
private JdbcTemplate jdbcTemplate;
// sort by single column name
public List<User> findAll(Sort sort) {
Order order = sort.toList().get(0);
return jdbcTemplate.query("SELECT * FROM USER ORDER BY "+order.getProperty()+" "+order.getDirection().name(),
(rs, rowNum) -> mapUserResult(rs));
}
private User mapUserResult(final ResultSet rs) throws SQLException {
User user = new User();
user.setId(rs.getLong("ID"));
user.setUserName(rs.getString("USER_NAME"));
user.setPassword(rs.getString("PASSWORD"));
user.setCreatedTime(rs.getDate("CREATED_TIME"));
user.setUpdatedTime(rs.getDate("UPDATED_TIME"));
user.setUserType(UserType.valueOf(rs.getString("USER_TYPE")));
user.setDateofBirth(rs.getDate("DOB"));
return user;
}
}
测试:
// By user name in descending order
Sort sort = Sort.by(Direction.fromString("DESC"), "USERNAME");
// Sorted Users
List<User> sortedUsers = userRepository.findAll(sort);
List<User> userList = users.stream().sorted(Comparator.comparing(User::getUserName).reversed())
.collect(Collectors.toList());
2. 分页和排序示例
若要获取分页结果,查询可能依赖于数据库。分页查询示例:
SELECT * FROM USER ORDER BY USERNAME ASC LIMIT 10 OFFSET 0;
LIMIT
表示查询返回的最大结果数。 – 是将所有结果划分为基于 的子集。每个集合的最大数目等于 。该值从零开始。例如,如果数据库表中有 105 条记录,并以 10 条形式提供,则总结果将分为 11 组。要获取第 5 组值,必须提供 4 个查询。OFFSET
LIMIT
LIMIT
OFFSET
LIMIT
OFFSET
分页的 Oracle 查询示例 (12C):
SELECT * FROM USER ORDER BY USERNAME DESC OFFSET 1 ROWS FETCH NEXT 10 ROWS ONLY;
public int count() {
return jdbcTemplate.queryForObject("SELECT count(*) FROM USER", Integer.class);
}
// defaults sorts by Id if order not provided
public Page<User> findAll(Pageable page) {
Order order = !page.getSort().isEmpty() ? page.getSort().toList().get(0) : Order.by("ID");
List<User> users = jdbcTemplate.query("SELECT * FROM USER ORDER BY " + order.getProperty() + " "
+ order.getDirection().name() + " LIMIT " + page.getPageSize() + " OFFSET " + page.getOffset(),
(rs, rowNum) -> mapUserResult(rs));
return new PageImpl<User>(users, page, count());
}
仅按页面和大小获取结果:
// total 12 users in sample data, set 5 users per page - total 3 pages
PageRequest pageable = PageRequest.of(0, 5);
// paged users - each page should have 5 users
Page<User> pagedUsers = userRepository.findAll(pageable);
通过分页和排序获取结果:
PageRequest pageable = PageRequest.of(0, 5, Direction.fromString("DESC"), "USERNAME");
Page<User> pagedUsers = userRepository.findAll(pageable);
3. 结论
在本指南中,我们介绍了如何使用 Spring Jdbc 模板实现分页和排序。
在 GitHub 上查看源代码。
其他春季 JDBC 示例:
- 春季 Jdbc 模板 – 批量更新
- 春季 Jdbc 模板 – 查询
- 弹簧 Jdbc 模板 – 存储过程
- 春季 Jdbc 模板 – IN 条款
- 弹簧 Jdbc 模板 – 自动生成的密钥
- 弹簧启动 – 加载初始数据