MyBatis自定义查询对象触发PageHelper隐式分页解析

当在MyBatis中使用PageHelper时,如果在配置文件中设置pagehelper.support-methods-arguments=true,并且自定义查询对象包含pageNum和pageSize属性,能够转为数字,即使不显式调用PageHelper.startPage,也会自动分页。触发分页的过程涉及PageHelperAutoConfiguration、PageInterceptor、PageParams和PageObjectUtil等组件。通过PageObjectUtil从参数对象中提取分页信息,如果找到pageNum和pageSize,就会执行分页查询。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先说结论,满足以下两点即可触发PageHelper隐式分页:

1、application.properties/application.yml中配置了pagehelper.support-methods-arguments=true

2、自定义查询对象中同时包含pageNum和pageSize属性,且可以转换成数字类型

下面从源码进行分析,为什么在进行MyBatis查询的时候,我明明没有调用PageHelper.startPage方法,但是却自动进行了分页。

1、PageHelperAutoConfiguration 自动配置类

@PostConstruct
public void addPageInterceptor() {
    PageInterceptor interceptor = new PageInterceptor();
    Properties properties = new Properties();
    properties.putAll(this.pageHelperProperties());
    properties.putAll(this.properties.getProperties());
    interceptor.setProperties(properties);
    Iterator var3 = this.sqlSessionFactoryList.iterator();

    while(var3.hasNext()) {
        SqlSessionFactory sqlSessionFactory = (SqlSessionFactory)var3.next();
        sqlSessionFactory.getConfiguration().addInterceptor(interceptor);
    }

}

我们从PageHelper的自动配置类入手,在PageHelper的配置类中,会创建一个PageInterceptor拦截器。

2、PageInterceptor 分页拦截器

public Object intercept(Invocation invocation) throws Throwable {
    try {
        Object[] args = invocation.getArgs();
        MappedStatement ms = (MappedStatement)args[0];
        Object parameter = args[1];
        RowBounds rowBounds = (RowBounds)args[2];
        ResultHandler resultHandler = (ResultHandler)args[3];
        Executor executor = (Executor)invocation.getTarget();
        CacheKey cacheKey;
        BoundSql boundSql;
        if (args.length == 4) {
            boundSql = ms.getBoundSql(parameter);
            cacheKey = executor.createCacheKey(ms, parameter, rowBounds, boundSql);
        } else {
            cacheKey = (CacheKey)args[4];
            boundSql = (BoundSql)args[5];
        }

        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值