1、mybatis整合Pagehelper原理

mybatis插件中有一个拦截器org.apache.ibatis.plugin.Interceptor,主要用于mybatis插件的植入。pagehelper的PageInterceptor实现了Interceptor,PageInterceptor在所有执行query操作时插入拦截。

地址为:Mybatis-PageHelper/src/main/java/com/github/pagehelper at master · pagehelper/Mybatis-PageHelper · GitHub。 

引入的jar包:

<!-- pagehelper-->
<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper</artifactId>
    <version>4.1.3</version>
</dependency>

官方文档,参考:Mybatis-PageHelper/HowToUse.md at master · pagehelper/Mybatis-PageHelper · GitHub

示例: 

package com.lxk.config;

import com.github.pagehelper.PageHelper;
import org.apache.ibatis.plugin.Interceptor;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.Properties;

@Configuration
public class PageHelperConfig {

    @Bean
    PageHelper pageHelper() {
        //分页插件
        PageHelper pageHelper = new PageHelper();
        Properties properties = new Properties();
        properties.setProperty("reasonable", "true");
        properties.setProperty("pageSizeZero", "true");
        properties.setProperty("supportMethodsArguments", "true");
        properties.setProperty("returnPageInfo", "check");
        properties.setProperty("params", "count=countSql");
        pageHelper.setProperties(properties);

        //添加插件
        new SqlSessionFactoryBean().setPlugins(new Interceptor[]{pageHelper});
        return pageHelper;
    }
}
@Override
    public PagerUtil<AdapterInstance> queryList(AdapterInstance adapterInstance){
        log.info("查询适配器列表开始:[{}]", adapterInstance);
        Page page = PageHelper.startPage(adapterInstance.getPageNum(), adapterInstance.getPageSize());
        List<AdapterInstance> adapterInstanceList = adapterInstanceMapper.queryList(adapterInstance);
        PageInfo info = new PageInfo<>(page.getResult());
        PagerUtil<AdapterInstance> pagerUtil = new PagerUtil<>(page.getPageNum(), page.getPageSize(), adapterInstanceList, (int) info.getTotal());
        log.info("查询适配器实例列表结束");
        return pagerUtil;
    }

 2、List转Page(Pagehelper)

public <T> PagerUtil<T> listConvertToPage(List<T> list, PageModel pageModel) {
        Page page = PageHelper.startPage(pageModel.getPageNum(), pageModel.getPageSize());

        if (CollectionUtils.isEmpty(list)) {
            return new PagerUtil<T>(page.getPageNum(), page.getPageSize(), null, 0);
        }

        Integer pageNum = pageModel.getPageNum();
        // offset  $offset=($page-1)*$pagesize
        int start = (pageModel.getPageNum() - 1) * pageModel.getPageSize();
        int end = (start + pageModel.getPageSize()) > list.size() ? list.size() : (start + pageModel.getPageSize());
        return new PagerUtil<T>(page.getPageNum(), page.getPageSize(), list.subList(start, end), list.size());
    }

3、FAQ:### The error occurred while setting parameters
### SQL: select **     from "standard_alarm_info"    order by update_time desc  limit 10; limit ? offset ?
### Cause: org.postgresql.util.PSQLException: ERROR: syntax error at or near "limit"

当pom中有 pageHelper 依赖,分页时有可能出现在sql 最后在拼接一次limit 的情况,把传入参数的明改一下就可以了

pageIndex 和 pageSize  这两个参数换个名即可 ,pageHelper 会判断入参中有没有这两个参数,有进行添加limit
 

4、扩展: Mybatis-plus使用分页进行分页查询

参考Mybatis-plus使用分页进行分页查询 - King-D - 博客园

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐