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