编码技巧——Mybatis分页插件PageHelper使用

本篇介绍Mybatis分页插件PageHelper的使用,本质上是Mybatis拦截器起作用,在执行目标SQL之前添加count语句及拼接limit到目标SQL后面,这里不再赘述,Mybatis拦截器相关知识可参考Mybatis——拦截器Interceptor,本篇仅简单介绍如何让一个使用Mybatis+springboot的项目快速接入PageHelper;

背景:接到需求,需要对一个老工程新写几个分页查询及导出的接口;查看了这个工程的代码,发现历史的分页接口竟然是手动拼出来的,非常之丑陋,准备引入Mybatis自带的分页插件,顺带记录下遇到的问题和最终引入PageHelper的步骤;

编码技巧——Mybatis分页插件PageHelper使用_第1张图片

遇到问题1:根据经验,只需要引入一个PageHelper的二方包,在springboot下,会自动注册Mybatis Interceptor并生效;发现SQL可以正常执行,但是分页参数都没有填充;所以问题应该是PageHelper并没有被正确的加入Mybatis拦截器列表,这一步可以通过打印原始的SQL来验证;

解决方案:继续引入pagehelper-spring-boot-starter并在配置类加载PageHelper的Bean;

遇到问题2:按照上述方案成功的引入了pagehelper,并且分页参数都被正常的填充;但是当把分页插件原生的com.github.pagehelper.Page作为返参返回时,发现缺失了分页参数如total、pageNum、pageSize等;发现Page其实仅继承了java.util.ArrayList,因此序列化的时候会当做一个List处理,分页参数都缺失了;

解决方案:自己封装分页返参实体类;

总结下正确引入Mybatis分页插件PageHelper的姿势

(1)引入依赖

以下依赖建议放到dal模块:

        
        
            com.github.pagehelper
            pagehelper
            5.2.0
        

以下依赖建议放到启动/配置boot模块

        
            com.github.pagehelper
            pagehelper-spring-boot-starter
            1.2.12
        

(2)配置Bean

@Configuration
public class PageHelperConfig {

    @Bean
    public PageHelper pageHelper() {
        PageHelper pageHelper = new PageHelper();
        Properties properties = new Properties();
        properties.setProperty("offsetAsPageNum", "true");
        properties.setProperty("rowBoundsWithCount", "true");
        properties.setProperty("reasonable", "true");
        properties.setProperty("dialect", "mysql");
        pageHelper.setProperties(properties);
        return pageHelper;
    }
}

(3)封装返参

/**
 * @author Akira
 * @description 默认的分页查询的封装类
 */
@Data
public class DefaultPageDTO {
    /**
     * 页码
     */
    private Integer pageNum;

    /**
     * 页面大小,默认size为10
     */
    private Integer pageSize;

    /**
     * 总数
     */
    private Long total;

    /**
     * 总页数
     */
    private Integer pages;

    /**
     * 查询记录列表
     */
    private List records;

    /**
     * 将com.github.pagehelper.Page封装成能打印出分页参数的DefaultPageDTO
     *
     * @param page
     * @param 
     * @return
     */
    public static  DefaultPageDTO init(Page page, Function converter) {
        DefaultPageDTO defaultPageDTO = new DefaultPageDTO<>();
        defaultPageDTO.setPageNum(page.getPageNum());
        defaultPageDTO.setPages(page.getPages());
        defaultPageDTO.setTotal(page.getTotal());
        defaultPageDTO.setPageSize(page.getPageSize());
        if (page.getTotal() > 0) {
            defaultPageDTO.setRecords(page.getResult().stream().map(converter).collect(Collectors.toList()));
        }
        return defaultPageDTO;
    }

}

你可能感兴趣的:(代码技巧,mybatis,pagehelper)