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 语句(如 selectById、insert)。

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 的方法(如 selectById、insert)时,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 优化。

相关推荐
高级程序源5 分钟前
springboot大学生体测系统72170-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·python·django·课程设计
IT研究室12 分钟前
最新计算机毕业设计选题推荐-基于spring boot的文学名著分享系统-网站-文档指导-Java-springboot
java·spring boot·课程设计
denlaku15 分钟前
JDK 13 新特性详解
java·开发语言
秋饼15 分钟前
Java 后端企业级 LLM 网关实战:Spring Cloud Gateway 构建统一大模型接入层
java·ai·技术分享·后端开发
今年下半年24 分钟前
【防重放】Spring Boot 通过自定义注解实现接口防重放
java·spring boot·自定义注解·防重放
WeiXin_DZbishe27 分钟前
基于Node.js的马拉松赛事管理系统的设计与实现-计算机毕设 附源码【课程设计】90211
java·javascript·vue.js·python·php·课程设计
Wang's Blog44 分钟前
Java 项目部署之 Docker工具快速入门: 使用 Docker 镜像命令练习
java·docker
企业数字化笔记1 小时前
多租户系统从哪里开始设计?租户身份、数据隔离、权限与套餐的整体方案
java·spring boot·后端·junit
tiger从容淡定是人生1 小时前
从 Gemini 的任务示例出发:AI 能否从知识中推导工作流?
java·人工智能·aigc·知识图谱·创业创新·零知识证明
Nebula_g1 小时前
JavaSE高级:动态代理
java·开发语言·算法·javase