以下是 com.baomidou.mybatisplus.core.override.MybatisMapperProxy
类的详细解析:
1. 类的作用
MybatisMapperProxy
是 MyBatis-Plus 框架中用于实现 Mapper 接口动态代理的核心类。它继承自 MyBatis 的 MapperProxy
,并扩展了以下功能:
- 增强 MyBatis 原生功能:如自动填充、逻辑删除、分页查询等。
- 拦截 Mapper 方法调用:在方法执行前后插入自定义逻辑(如 SQL 优化、参数校验)。
- 动态 SQL 构建:支持自动生成基础 CRUD 的 SQL 语句(如
selectById
、insert
)。
2. 核心功能与实现
(1) 动态代理机制
- 继承关系:
MybatisMapperProxy
继承自 MyBatis 的MapperProxy
,并重写了invoke
方法。 - 代理对象生成:当调用 Mapper 接口时,MyBatis-Plus 会通过
MapperProxyFactory
创建MybatisMapperProxy
的实例作为代理对象。 - 方法拦截:在
invoke
方法中,拦截 Mapper 接口的调用,执行增强逻辑后再调用原始 SQL。
(2) 关键方法
-
invoke
方法:@Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {// 1. 判断是否为 Object 的默认方法(如 toString),直接调用// 2. 判断是否为 MyBatis-Plus 增强方法(如 selectList Wrapper)// 3. 执行拦截器(Interceptor)链(如自动填充、逻辑删除)// 4. 调用原始 MapperProxy 的 invoke 方法执行 SQLreturn super.invoke(proxy, method, args); }
- 增强逻辑:在调用原始 SQL 之前,会执行 MyBatis-Plus 的拦截器链(
Interceptor
),例如:- 自动填充:通过
MetaObjectHandler
自动填充字段(如创建时间、更新时间)。 - 逻辑删除:通过
IS_DELETED
字段过滤已删除数据。 - 分页插件:动态拼接分页 SQL。
- 自动填充:通过
- 增强逻辑:在调用原始 SQL 之前,会执行 MyBatis-Plus 的拦截器链(
(3) 与 MyBatis-Plus 核心组件的关联
SqlSessionFactory
:通过工厂生成 SQL 会话。Interceptor
:拦截器链(如分页插件、逻辑删除插件)在此处被调用。MapperRegistry
:注册 Mapper 接口,管理代理对象的创建。
3. 典型使用场景
(1) 基础 CRUD 自动化
- 当调用
BaseMapper
的方法(如selectById
、insert
)时,MybatisMapperProxy
会自动生成对应的 SQL 语句。 - 示例:
User user = userMapper.selectById(1L); // 自动生成 SELECT * FROM user WHERE id = 1
(2) 拦截器扩展
- 通过自定义
Interceptor
实现扩展逻辑:public class MyInterceptor implements Interceptor {@Overridepublic Object intercept(Invocation invocation) throws Throwable {// 拦截 SQL 执行前的逻辑(如日志、权限校验)return invocation.proceed(); // 继续执行后续逻辑} }
(3) 逻辑删除
- 当查询时,自动添加
IS_DELETED = 0
条件:List<User> users = userMapper.selectList(null); // 自动过滤已删除数据
4. 常见问题排查
(1) SQL 未生效
- 检查是否配置了
@TableName
注解或表名映射。 - 确保
BaseMapper
被正确继承。
(2) 拦截器未生效
- 检查拦截器是否被正确注册到
MyBatis-Plus
配置中:@Configuration public class MyBatisPlusConfig {@Beanpublic MybatisInterceptor mybatisPlusInterceptor() {MybatisInterceptor interceptor = new MybatisInterceptor();interceptor.addInterceptors(new MyInterceptor());return interceptor;} }
5. 源码关键路径
- 代理工厂:
MapperProxyFactory
创建MybatisMapperProxy
。 - 拦截器链:
InterceptorChain
调用所有注册的拦截器。 - SQL 执行:最终通过
SqlSession
执行 SQL。
6. 总结
MybatisMapperProxy
是 MyBatis-Plus 的核心代理类,通过动态代理和拦截器机制实现了功能增强。开发者可通过自定义拦截器或配置扩展其行为,例如实现权限校验、日志记录或 SQL 优化。