# 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(
distinct、group by、union等)自动降级为子查询 count Page<E>结果封装:包含pageNum、pageSize、total、pages、orderBy等字段- 虚拟线程友好:用
ScopedValue替代ThreadLocal,降低上下文串线风险 - 插件链扩展:分页可作为插件挂载到 MyBatis 执行链中,便于后续组合数据隔离/多租户/审计等能力
# 环境要求
- JDK:25+
- MyBatis:3.5.19
- Spring Boot:4.x(示例依赖于
spring-boot-autoconfigure:4.0.3、mybatis-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 在并发/虚拟线程下的“串线”风险。