MyBatis 分页插件
MyBatis可以通过插件来很好的支持分页查询,目前最成熟的是pagehelper这个第三方插件。
<dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>1.2.13</version></dependency>
改造UserController.getAll方法
import com.github.pagehelper.Page;import com.github.pagehelper.PageHelper;import com.youkeda.comment.dao.UserDAO;import com.youkeda.comment.dataobject.UserDO;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.format.annotation.DateTimeFormat;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.*;import java.time.LocalDateTime;import java.util.List;@Controllerpublic class UserController {@Autowiredprivate UserDAO userDAO;@GetMapping("/users")@ResponseBodypublic List<UserDO> getAll() {// 设置当前页数为1,以及每页3条记录Page<UserDO> page = PageHelper.startPage(1, 3).doSelectPage(() -> userDAO.findAll());return page.getResult();}}
PageHelper.startPage(1, 3);
第一个参数表示指定页数,第二个参数指定每页的记录数。
MyBatis PageHelper比较智能,如果查询第0页会自动转化为第一页,如果查询页数超过总页数页会自动查询最后一页。
返回类型Page对象是MyBatis封装的分页模式。
- getResult()获取分页数据。
- getPages()获取总页数
- getTotal()获取总记录数
- getPageNum()获取当前页
在企业开发中,我们都会额外封装一个通用的分页模型Paging用于处理返回值,参考如下:(以后各种项目中可能会经常复用这个模型)
import java.io.Serializable;import java.util.List;/*** 分页模型*/public class Paging<R> implements Serializable {private static final long serialVersionUID = 522660448543880825L;/*** 页数*/private int pageNum;/*** 每页数量*/private int pageSize = 15;/*** 总页数*/private int totalPage;/*** 总记录数*/private long totalCount;/*** 集合数据*/private List<R> data;public Paging() {}public Paging(int pageNum, int pageSize, int totalPage, long totalCount, List<R> data) {this.pageNum = pageNum;this.pageSize = pageSize;this.totalPage = totalPage;this.totalCount = totalCount;this.data = data;}// 省略 getter、setter}
继续改造:
@Controllerpublic class UserController {@Autowiredprivate UserDAO userDAO;@GetMapping("/users")@ResponseBodypublic Paging<UserDO> getAll() {// 设置当前页数为1,以及每页3条记录Page<UserDO> page = PageHelper.startPage(1, 3).doSelectPage(() -> userDAO.findAll());return new Paging<>(page.getPageNum(), page.getPageSize(), page.getPages(), page.getTotal(), page.getResult());}}
加上两个可选参数:
@GetMapping("/comments")@ResponseBodypublic Paging<CommentDO> getAll(@RequestParam(value = "pageNum" ,required = false,defaultValue = "1") Integer pageNum, @RequestParam(value = "pageSize",required = false,defaultValue = "15") Integer pageSize) {// pageNum = pageNum == null ? 0:pageNum;Page<CommentDO> page = PageHelper.startPage(pageNum, pageSize).doSelectPage(() -> commentDAO.findAll());return new Paging<>(page.getPageNum(), page.getPageSize(), page.getPages(), page.getTotal(), page.getResult());}
Druid 连接池
性能优化,一般来说数据源连接池是最佳优化方案。采用数据源连接池可以极大地提高数据处理能力,因为连接数据库比较耗时,每次查询重新连接数据库性能十分低下,换成连接池就可以复用连接,不用每次都去连接。(这个概念面试的时候会提问)
目前Spring boot 官方集成的连接池是 HikariCp
阿里巴巴出品 Druid优势:
- 性能优越(略低于HikariCp)
- 扩展能力极强
- 具备SQL拦截功能
- 具备数据统计分析功能,比如慢SQL分析
添加依赖
<dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.1.23</version></dependency>
中文文档
在application.properties添加配置项
spring.datasource.druid.stat-view-servlet.enabled=truespring.datasource.druid.stat-view-servlet.url-pattern=/druid/*spring.datasource.druid.stat-view-servlet.login-username=druidspring.datasource.druid.stat-view-servlet.login-password=druidspring.datasource.druid.stat-view-servlet.allow=spring.datasource.druid.stat-view-servlet.deny=
login-username和login-password可以自己定义。
运行之后本地访问地址是:http://localhost:8080/druid/login.html
