mybatis-plus里的com.baomidou.mybatisplus.core.override.MybatisMapperProxy 类的详细解析

以下是 com.baomidou.mybatisplus.core.override.MybatisMapperProxy 类的详细解析:


1. 类的作用

MybatisMapperProxy 是 MyBatis-Plus 框架中用于实现 Mapper 接口动态代理的核心类 。它继承自 MyBatis 的 MapperProxy,并扩展了以下功能:

  • 增强 MyBatis 原生功能:如自动填充、逻辑删除、分页查询等。
  • 拦截 Mapper 方法调用:在方法执行前后插入自定义逻辑(如 SQL 优化、参数校验)。
  • 动态 SQL 构建 :支持自动生成基础 CRUD 的 SQL 语句(如 selectByIdinsert)。

2. 核心功能与实现

(1) 动态代理机制
  • 继承关系MybatisMapperProxy 继承自 MyBatis 的 MapperProxy,并重写了 invoke 方法。
  • 代理对象生成 :当调用 Mapper 接口时,MyBatis-Plus 会通过 MapperProxyFactory 创建 MybatisMapperProxy 的实例作为代理对象。
  • 方法拦截 :在 invoke 方法中,拦截 Mapper 接口的调用,执行增强逻辑后再调用原始 SQL。
(2) 关键方法
  • invoke 方法

    java 复制代码
    @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 方法执行 SQL
        return super.invoke(proxy, method, args);
    }
    • 增强逻辑 :在调用原始 SQL 之前,会执行 MyBatis-Plus 的拦截器链(Interceptor),例如:
      • 自动填充 :通过 MetaObjectHandler 自动填充字段(如创建时间、更新时间)。
      • 逻辑删除 :通过 IS_DELETED 字段过滤已删除数据。
      • 分页插件:动态拼接分页 SQL。
(3) 与 MyBatis-Plus 核心组件的关联
  • SqlSessionFactory:通过工厂生成 SQL 会话。
  • Interceptor:拦截器链(如分页插件、逻辑删除插件)在此处被调用。
  • MapperRegistry:注册 Mapper 接口,管理代理对象的创建。

3. 典型使用场景

(1) 基础 CRUD 自动化
  • 当调用 BaseMapper 的方法(如 selectByIdinsert)时,MybatisMapperProxy 会自动生成对应的 SQL 语句。

  • 示例

    java 复制代码
    User user = userMapper.selectById(1L); // 自动生成 SELECT * FROM user WHERE id = 1
(2) 拦截器扩展
  • 通过自定义 Interceptor 实现扩展逻辑:

    java 复制代码
    public class MyInterceptor implements Interceptor {
        @Override
        public Object intercept(Invocation invocation) throws Throwable {
            // 拦截 SQL 执行前的逻辑(如日志、权限校验)
            return invocation.proceed(); // 继续执行后续逻辑
        }
    }
(3) 逻辑删除
  • 当查询时,自动添加 IS_DELETED = 0 条件:

    java 复制代码
    List<User> users = userMapper.selectList(null); // 自动过滤已删除数据

4. 常见问题排查

(1) SQL 未生效
  • 检查是否配置了 @TableName 注解或表名映射。
  • 确保 BaseMapper 被正确继承。
(2) 拦截器未生效
  • 检查拦截器是否被正确注册到 MyBatis-Plus 配置中:

    java 复制代码
    @Configuration
    public class MyBatisPlusConfig {
        @Bean
        public MybatisInterceptor mybatisPlusInterceptor() {
            MybatisInterceptor interceptor = new MybatisInterceptor();
            interceptor.addInterceptors(new MyInterceptor());
            return interceptor;
        }
    }

5. 源码关键路径

  1. 代理工厂MapperProxyFactory 创建 MybatisMapperProxy
  2. 拦截器链InterceptorChain 调用所有注册的拦截器。
  3. SQL 执行 :最终通过 SqlSession 执行 SQL。

6. 总结

MybatisMapperProxy 是 MyBatis-Plus 的核心代理类,通过动态代理和拦截器机制实现了功能增强。开发者可通过自定义拦截器或配置扩展其行为,例如实现权限校验、日志记录或 SQL 优化。

相关推荐
兩尛2 分钟前
Spring面试
java·spring·面试
Java中文社群9 分钟前
服务器被攻击!原因竟然是他?真没想到...
java·后端
Full Stack Developme20 分钟前
java.nio 包详解
java·python·nio
零千叶37 分钟前
【面试】Java JVM 调优面试手册
java·开发语言·jvm
代码充电宝1 小时前
LeetCode 算法题【简单】290. 单词规律
java·算法·leetcode·职场和发展·哈希表
li3714908901 小时前
nginx报400bad request 请求头过大异常处理
java·运维·nginx
摇滚侠1 小时前
Spring Boot 项目, idea 控制台日志设置彩色
java·spring boot·intellij-idea
Aevget2 小时前
「Java EE开发指南」用MyEclipse开发的EJB开发工具(二)
java·ide·java-ee·eclipse·myeclipse
黄昏晓x2 小时前
C++----多态
java·jvm·c++
Brookty2 小时前
【算法】前缀和
java·学习·算法·前缀和·动态规划