Spring Boot JdbcTemplate – 分页示例

春季 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 个查询。OFFSETLIMITLIMITOFFSETLIMITOFFSET

分页的 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 示例:

  1. 春季 Jdbc 模板 – 批量更新
  2. 春季 Jdbc 模板 – 查询
  3. 弹簧 Jdbc 模板 – 存储过程
  4. 春季 Jdbc 模板 – IN 条款
  5. 弹簧 Jdbc 模板 – 自动生成的密钥
  6. 弹簧启动 – 加载初始数据

4. 参考资料

  1. 春季文件
  2. 春季 Jdbc 模板查询
  3. 弹簧启动数据 Jdbc 示例
  4. 春季数据 Jdbc 分页示例
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值