以下是 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 优化。
