MyBatis 分页插件

MyBatis可以通过插件来很好的支持分页查询,目前最成熟的是pagehelper这个第三方插件。

  1. <dependency>
  2. <groupId>com.github.pagehelper</groupId>
  3. <artifactId>pagehelper-spring-boot-starter</artifactId>
  4. <version>1.2.13</version>
  5. </dependency>

改造UserController.getAll方法

  1. import com.github.pagehelper.Page;
  2. import com.github.pagehelper.PageHelper;
  3. import com.youkeda.comment.dao.UserDAO;
  4. import com.youkeda.comment.dataobject.UserDO;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.format.annotation.DateTimeFormat;
  7. import org.springframework.stereotype.Controller;
  8. import org.springframework.web.bind.annotation.*;
  9. import java.time.LocalDateTime;
  10. import java.util.List;
  11. @Controller
  12. public class UserController {
  13. @Autowired
  14. private UserDAO userDAO;
  15. @GetMapping("/users")
  16. @ResponseBody
  17. public List<UserDO> getAll() {
  18. // 设置当前页数为1,以及每页3条记录
  19. Page<UserDO> page = PageHelper.startPage(1, 3).doSelectPage(() -> userDAO.findAll());
  20. return page.getResult();
  21. }
  22. }
  1. PageHelper.startPage(1, 3);

第一个参数表示指定页数,第二个参数指定每页的记录数。
MyBatis PageHelper比较智能,如果查询第0页会自动转化为第一页,如果查询页数超过总页数页会自动查询最后一页。
返回类型Page对象是MyBatis封装的分页模式。

  • getResult()获取分页数据。
  • getPages()获取总页数
  • getTotal()获取总记录数
  • getPageNum()获取当前页

在企业开发中,我们都会额外封装一个通用的分页模型Paging用于处理返回值,参考如下:(以后各种项目中可能会经常复用这个模型)

  1. import java.io.Serializable;
  2. import java.util.List;
  3. /**
  4. * 分页模型
  5. */
  6. public class Paging<R> implements Serializable {
  7. private static final long serialVersionUID = 522660448543880825L;
  8. /**
  9. * 页数
  10. */
  11. private int pageNum;
  12. /**
  13. * 每页数量
  14. */
  15. private int pageSize = 15;
  16. /**
  17. * 总页数
  18. */
  19. private int totalPage;
  20. /**
  21. * 总记录数
  22. */
  23. private long totalCount;
  24. /**
  25. * 集合数据
  26. */
  27. private List<R> data;
  28. public Paging() {
  29. }
  30. public Paging(int pageNum, int pageSize, int totalPage, long totalCount, List<R> data) {
  31. this.pageNum = pageNum;
  32. this.pageSize = pageSize;
  33. this.totalPage = totalPage;
  34. this.totalCount = totalCount;
  35. this.data = data;
  36. }
  37. // 省略 getter、setter
  38. }

继续改造:

  1. @Controller
  2. public class UserController {
  3. @Autowired
  4. private UserDAO userDAO;
  5. @GetMapping("/users")
  6. @ResponseBody
  7. public Paging<UserDO> getAll() {
  8. // 设置当前页数为1,以及每页3条记录
  9. Page<UserDO> page = PageHelper.startPage(1, 3).doSelectPage(() -> userDAO.findAll());
  10. return new Paging<>(page.getPageNum(), page.getPageSize(), page.getPages(), page.getTotal(), page
  11. .getResult());
  12. }
  13. }

加上两个可选参数:

  1. @GetMapping("/comments")
  2. @ResponseBody
  3. public Paging<CommentDO> getAll(@RequestParam(value = "pageNum" ,required = false,defaultValue = "1") Integer pageNum, @RequestParam(value = "pageSize",required = false,defaultValue = "15") Integer pageSize) {
  4. // pageNum = pageNum == null ? 0:pageNum;
  5. Page<CommentDO> page = PageHelper.startPage(pageNum, pageSize).doSelectPage(() -> commentDAO.findAll());
  6. return new Paging<>(page.getPageNum(), page.getPageSize(), page.getPages(), page.getTotal(), page.getResult());
  7. }

Druid 连接池

性能优化,一般来说数据源连接池是最佳优化方案。采用数据源连接池可以极大地提高数据处理能力,因为连接数据库比较耗时,每次查询重新连接数据库性能十分低下,换成连接池就可以复用连接,不用每次都去连接。(这个概念面试的时候会提问)
目前Spring boot 官方集成的连接池是 HikariCp
阿里巴巴出品 Druid优势:

  • 性能优越(略低于HikariCp)
  • 扩展能力极强
  • 具备SQL拦截功能
  • 具备数据统计分析功能,比如慢SQL分析

添加依赖

  1. <dependency>
  2. <groupId>com.alibaba</groupId>
  3. <artifactId>druid-spring-boot-starter</artifactId>
  4. <version>1.1.23</version>
  5. </dependency>

中文文档
在application.properties添加配置项

  1. spring.datasource.druid.stat-view-servlet.enabled=true
  2. spring.datasource.druid.stat-view-servlet.url-pattern=/druid/*
  3. spring.datasource.druid.stat-view-servlet.login-username=druid
  4. spring.datasource.druid.stat-view-servlet.login-password=druid
  5. spring.datasource.druid.stat-view-servlet.allow=
  6. spring.datasource.druid.stat-view-servlet.deny=

login-usernamelogin-password可以自己定义。
运行之后本地访问地址是:http://localhost:8080/druid/login.html
image.png