# g2rain-mybatis-extensions(生态扩展)

g2rain-mybatis-extensions 是一个基于 MyBatis 拦截器的分页与扩展框架,面向 JDK 25 场景设计,利用 虚拟线程 + ScopedValue 提供高性能、低侵入的分页能力,并抽象出可扩展的统一插件链机制。

# 模块概览

  • g2rain-mybatis-extension:MyBatis 拦截器扩展核心(CompositeInterceptor / ExecutorCompositeInterceptor,以及 PluginProcessor 插件链)
  • g2rain-mybatis-pagination:分页插件实现(Page / PageContext + PaginationQueryProcessor,并使用 ScopedValue 管理分页上下文)
  • g2rain-starter-mybatis-pagination:Spring Boot Starter(自动装配分页插件与拦截器,可配置执行顺序)

# 核心特性

  • 自动构建分页 SQL 与 count SQL:无需在 Mapper 手写 LIMIT/OFFSET
  • 针对复杂 SQL(distinctgroup byunion 等)自动降级为子查询 count
  • Page<E> 结果封装:包含 pageNumpageSizetotalpagesorderBy 等字段
  • 虚拟线程友好:用 ScopedValue 替代 ThreadLocal,降低上下文串线风险
  • 插件链扩展:分页可作为插件挂载到 MyBatis 执行链中,便于后续组合数据隔离/多租户/审计等能力

# 环境要求

  • JDK:25+
  • MyBatis:3.5.19
  • Spring Boot:4.x(示例依赖于 spring-boot-autoconfigure:4.0.3mybatis-spring-boot-starter:4.0.1

# 使用方式(Spring Boot 场景)

引入 g2rain-starter-mybatis-pagination 后,PaginationAutoConfiguration 会自动完成:

  • 注册分页处理器:PaginationQueryProcessor
  • 注册拦截器:ExecutorCompositeInterceptor(bean 名称为 paginationExecutorCompositeInterceptor

可在配置中调整执行顺序(可选):

g2rain:
  mybatis:
    pagination:
      order: 20000

业务代码使用 PageContext 发起分页查询:

import com.g2rain.mybatis.pagination.model.Page;
import com.g2rain.mybatis.pagination.model.PageContext;

Page<User> page = PageContext.of(1, 10, "id desc", () -> {
  userMapper.selectList(...);
});

long total = page.getTotal();
int pages = page.getPages();
List<User> records = page.getResult();

# 虚拟线程兼容说明

该实现使用 ScopedValue 管理分页上下文,因此在虚拟线程场景下也能保持上下文隔离,避免传统 ThreadLocal 在并发/虚拟线程下的“串线”风险。