mybatis-plus 自定义全局操作通过扩展 autosqlinjector 实现“写一次、处处可用”,无需每个 mapper 写 xml 或重复定义方法;定义接口方法(如 int deleteall()),继承 autosqlinjector 重写 inject 方法绑定 sql,再将注入器配置为 bean 并确保先于 sqlsessionfactory 初始化。

MyBatis-Plus 的自定义全局操作,本质是通过扩展 AutoSqlInjector,把通用 SQL 逻辑一次性注入到所有继承 BaseMapper 的 Mapper 接口中,实现“写一次、处处可用”。不需要每个 Mapper 都写 XML 或重复定义方法,也不依赖具体实体类。
定义 Mapper 接口方法
在任意 Mapper 接口中声明你要复用的方法,比如清空整张表:
- 方法名和返回值需与后续 SQL 类型匹配(如
int deleteAll()对应 DELETE 语句) - 无需实现,MP 启动时会自动绑定 SQL
- 示例:
public interface UserMapper extends BaseMapper{
int deleteAll();
}
编写自定义 SQL 注入器
继承 AutoSqlInjector,重写 inject 方法,把 SQL 字符串和接口方法名绑定为 MapperStatement:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 从
TableInfo获取当前表名,避免硬编码 - 用
languageDriver.createSqlSource()构建可执行的 SQL 源 - 调用
addDeleteMappedStatement(或addSelectMappedStatement等)完成注册 - 示例中 SQL 为
"delete from " + table.getTableName(),适用于无条件全删场景
配置注入器到全局策略
将自定义注入器作为 Bean 注入 MP 的全局配置中,确保它在启动时生效:
- Spring XML 方式:在
globalConfiguration的sqlInjector属性引用该 Bean - Spring Boot yml 方式不直接支持,需用 Java Config 声明
@Bean GlobalConfiguration并 setSqlInjector - 注意:必须保证注入器 Bean 先于
SqlSessionFactory初始化,否则无效
进阶扩展:支持带参数或主库路由的通用方法
如果需要更灵活的能力(如强制走主库、带条件删除),可参考官方 SqlMethod 枚举的设计思路:
- 定义新枚举项,如
MASTER_SELECT_LIST,封装 SQL 模板和方法名映射 - SQL 模板中可预留占位符(如
%s),由 MP 自动填充 WHERE 条件或字段列表 - 在注入器中调用
new DynamicSqlSource()或拼接带注释的 SQL(如/*+ db_route:master */ SELECT ...) - 这样就能衍生出
selectListFromMaster()这类语义明确、跨实体复用的方法
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










