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

news2025/7/17 5:43:03

以下是 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 方法

    @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 语句。
  • 示例
    User user = userMapper.selectById(1L); // 自动生成 SELECT * FROM user WHERE id = 1
    
(2) 拦截器扩展
  • 通过自定义 Interceptor 实现扩展逻辑:
    public class MyInterceptor implements Interceptor {
        @Override
        public 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 {
        @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 优化。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2344586.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

在java程序中,类,进程,线程他们之间的关系以及main方法与他们之间的关系

在 Java 程序里&#xff0c;类、进程、线程各自有着不同的概念&#xff0c;同时也存在着紧密的联系&#xff0c;下面来详细分析它们之间的关系以及 main 方法和它们的关系。 类 类是 Java 中最基础的编程单元&#xff0c;是一种自定义的数据类型&#xff0c;它定义了对象的属…

[ACTF2020 新生赛]BackupFile题解

启动环境 进入后只有一段话&#xff0c;没有其他的说法。 解题方法 但是题目命名为backup file&#xff0c;应该是备份文件的意思&#xff0c;那么就用dirsearch工具来扫一下看看。 查看扫描结果 index.php.bak 下载下这个文件&#xff0c;查看文件内容。 进行php代码审计…

如何修改npm的全局安装路径?

修改 npm 的全局安装路径可以通过以下步骤完成&#xff0c;确保全局包&#xff08;使用 -g 安装的模块&#xff09;和缓存文件存储到自定义路径。以下是详细步骤&#xff1a; 1. 创建自定义路径的目录 在目标路径下创建两个文件夹&#xff0c;分别用于存储全局模块和缓存文件…

巧用 Element - UI 实现图片上传按钮的智能隐藏

引言 在前端开发中&#xff0c;使用 Element - UI 组件库来构建用户界面是非常常见的操作。其中图片上传功能更是在许多项目中频繁出现&#xff0c;比如用户头像上传、商品图片上传等场景。有时候&#xff0c;我们会有这样的需求&#xff1a;当上传图片达到一定数量后&#xf…

从“拼凑”到“构建”:大语言模型系统设计指南!

你有没有试过在没有说明书的情况下组装宜家家具?那种手忙脚乱却又充满期待的感觉,和设计大语言模型(LLM)系统时如出一辙。如果没有一个清晰的计划,很容易陷入混乱。我曾经也一头扎进去,满心期待却又手足无措,被网上那些复杂的架构图搞得晕头转向。于是,我坐下来,把它们…

【数据结构与算法】从完全二叉树到堆再到优先队列

完全二叉树 CBT 设二叉树的深度为 h , 若非最底层的其他各层的节点数都达到最大个数 , 最底层 h 的所有节点都连续集中在左侧的二叉树叫做 完全二叉树 . 特点 对任意节点 , 其右分支下的叶子节点的最底层为 L , 则其左分支下的叶子节点的最低层一定是 L 或 L 1 .完全二叉树…

【Linux网络】构建类似XShell功能的TCP服务器

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;博客仓库&#xff1a;https://gitee.com/JohnKingW/linux_test/tree/master/lesson &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &…

Spring Boot 配置源详解(完整版)

Spring Boot 配置源详解&#xff08;完整版&#xff09; 一、配置源加载顺序与优先级 配置源类型优先级顺序&#xff08;从高到低&#xff09;对应配置类/接口是否可覆盖典型文件/来源命令行参数&#xff08;--keyvalue&#xff09;1&#xff08;最高&#xff09;SimpleComman…

puppeteer注入浏览器指纹过CDP

一、背景 通过puppeteer爬取目标网站时&#xff0c;经常会被对方网站检测到&#xff0c;比如原生puppeteerCDP特征非常明显&#xff0c;另外指纹如果一直不变&#xff0c;也会引发风控 二、实现 通过以下几行代码即可轻松过大部分检测点&#xff0c;并且能够切换指纹&#x…

软件项目实施全流程及交付物清单

需求分析 -> 概要设计 -> 详细设计 -> 开发实现 -> 测试 -> 部署 -> 运维 一、确认项目目标、范围和团队成员 二、收集和分析客户需求&#xff0c;确定需求规格 三、制定详细的项目计划&#xff0c;包括时间表、资源计划、预算 四、系统架构设计&#xf…

【2025计算机网络-面试常问】http和https区别是什么,http的内容有哪些,https用的是对称加密还是非对称加密,流程是怎么样的

HTTP与HTTPS全面对比及HTTPS加密流程详解 一、HTTP与HTTPS核心区别 特性HTTPHTTPS协议基础明文传输HTTP SSL/TLS加密层默认端口80443加密方式无加密混合加密&#xff08;非对称对称&#xff09;证书要求不需要需要CA颁发的数字证书安全性易被窃听、篡改、冒充防窃听、防篡改…

从梯度消失到百层网络:ResNet 是如何改变深度学习成为经典的?

自AlexNet赢得2012年ImageNet竞赛以来&#xff0c;每个新的获胜架构通常都会增加更多层数以降低错误率。一段时间内&#xff0c;增加层数确实有效&#xff0c;但随着网络深度的增加&#xff0c;深度学习中一个常见的问题——梯度消失或梯度爆炸开始出现。 梯度消失问题会导致梯…

Uni-App 多端电子合同开源项目介绍

项目概述 本项目是一款基于 uni-app框架开发的多端电子合同管理平台&#xff0c;旨在为企业及个人用户提供高效、安全、便捷的电子合同签署与管理服务。项目创新性地引入了 “证据链”与“非证据链”两种签署模式&#xff0c;满足不同场景下的签署需求&#xff0c;支持多种签署…

多语言笔记系列:共享数据

在笔记中共享数据(变量) 使用 .NET 交互式内核&#xff0c;可以在单个笔记本中以多种语言编写代码。为了利用每种语言的不同优势&#xff0c;您会发现在它们之间共享数据很有用。即一种语言的变量&#xff0c;可以在其它语言中使用。 默认情况下&#xff0c;.NET Interactive …

如何使用SeedProd创建无缝的WordPress维护页面

不管您刚接触 WordPress &#xff0c;还是经验丰富的站长&#xff0c;SeedProd 都是创建网站维护页面的得力助手。通过SeedProd&#xff0c;您可以轻松创建一个与网站风格一致、功能齐全的维护页面&#xff0c;让您的用户在网站维护期间也能感受到您的专业与关怀。本文将为您提…

使用Python设置excel单元格的字体(font值)

一、前言 通过使用Python的openpyxl库&#xff0c;来操作excel单元格&#xff0c;设置单元格的字体&#xff0c;也就是font值。 把学习的过程分享给大家。大佬勿喷&#xff01; 二、程序展示 1、新建excel import openpyxl from openpyxl.styles import Font wb openpyxl.…

求解,如何控制三相无刷电机?欢迎到访评论

问题&#xff1a;通过一个集成的TF2104芯片控制H桥上桥臂和下桥臂&#xff0c;如何控制&#xff1f;还是说得需要PWM_UH和PWM_UL分开控制&#xff1f;

365打卡第R3周: RNN-心脏病预测

&#x1f368; 本文为&#x1f517;365天深度学习训练营中的学习记录博客 &#x1f356; 原作者&#xff1a;K同学啊 &#x1f3e1; 我的环境&#xff1a; 语言环境&#xff1a;Python3.10 编译器&#xff1a;Jupyter Lab 深度学习环境&#xff1a;torch2.5.1 torchvision0…

【实战】基于强化学习的 Agent 训练框架全流程拆解

一、引言 在人工智能蓬勃发展的今天&#xff0c;强化学习&#xff08;Reinforcement Learning, RL&#xff09;作为让智能体&#xff08;Agent&#xff09;在复杂环境中自主学习并做出最优决策的核心技术&#xff0c;正日益受到关注。从游戏领域中击败人类顶尖选手的 AlphaGo&a…

【音视频】⾳频处理基本概念及⾳频重采样

一、重采样 1.1 什么是重采样 所谓的重采样&#xff0c;就是改变⾳频的采样率、sample format、声道数等参数&#xff0c;使之按照我们期望的参数输出。 1.2 为什么要重采样 为什么要重采样? 当然是原有的⾳频参数不满⾜我们的需求&#xff0c;⽐如在FFmpeg解码⾳频的时候…