当前位置: 首页 > news >正文

mybatis-plus原理

Mybatis-Plus (MP) 的核心原理可以理解为在 ​​MyBatis 基础之上,通过一系列巧妙的封装、扩展和自动化机制​​,极大地简化了单表 CRUD 操作和常见功能的开发。其核心原理主要包括以下几个方面:

  1. ​自动配置与集成 (Spring Boot Starter):​

    • MP 提供了 mybatis-plus-boot-starter,利用 Spring Boot 的自动配置机制。
    • 启动时,自动配置类 (MybatisPlusAutoConfiguration) 会:
      • 根据配置 (application.yml/properties) 创建并配置 DataSource
      • 创建并配置 SqlSessionFactoryBean,并​​自动注入 MP 的核心组件​​(如 GlobalConfig, Interceptor 等)。
      • 配置 MapperScannerConfigurer,自动扫描并注册 Mapper 接口。
  2. ​核心接口 BaseMapper:​

    • 这是 MP 的核心创新点之一。用户自定义的 Mapper 接口只需要继承 BaseMapper 并指定泛型为对应的实体类。
    • BaseMapper 中预定义了大量的​​通用 CRUD 方法​​,如 insert, deleteById, updateById, selectById, selectList, selectPage 等。
    • ​原理:​​ MP 在运行时,会通过 ​​MyBatis 的动态代理机制​​,为继承了 BaseMapper 的接口生成代理对象。当调用这些预定义方法时,代理对象会​​根据方法名、参数类型、实体类信息等,动态生成对应的 SQL 语句并执行​​。用户无需为这些通用操作编写任何 SQL 或 XML。
  3. ​SQL 自动生成机制 (AbstractMethod / SqlInjector):​

    • 这是 BaseMapper 功能实现的核心引擎。
    • MP 内部定义了一个枚举类 SqlMethod,包含了各种 CRUD 操作对应的 SQL 语句模板(如 INSERT_ONE, DELETE_BY_ID, SELECT_BY_ID)。
    • 对于 BaseMapper 中的每个方法,MP 都有一个对应的 AbstractMethod 子类(如 Insert, DeleteById, SelectById)。这些类负责:
      • 解析方法签名和参数。
      • 获取实体类的​​元数据信息​​(通过 TableInfo 类,该类在应用启动时根据实体类注解如 @TableName, @TableId, @TableField 等构建)。
      • SqlMethod 中的 SQL 模板与实体元数据结合,​​动态组装​​出最终要执行的、包含真实表名和字段名的完整 SQL 语句。
      • 将组装好的 SQL 和参数传递给 MyBatis 执行。
    • SqlInjector (如 DefaultSqlInjector) 负责将 AbstractMethod 的实现​​“注入”​​到 Mapper 接口的代理对象中,使其拥有执行这些方法的能力。
  4. ​条件构造器 (Wrapper):​

    • 提供了 QueryWrapper, UpdateWrapper, LambdaQueryWrapper, LambdaUpdateWrapper 等强大的条件构造工具。
    • ​原理:​​ 用户通过链式调用(如 .eq("name", "Alice"), .gt("age", 18), .like("email", "@gmail.com"))构建复杂的查询或更新条件。
    • Wrapper 内部将这些条件表达式​​解析并存储为一个抽象语法树(AST)或类似结构​​。
    • Wrapper 被用于查询(如 selectList(wrapper))或更新(如 update(entity, wrapper))时,MP 的 SQL 生成引擎会:
      • 解析 Wrapper 中的条件表达式。
      • 将这些条件​​安全地​​(防止 SQL 注入)​​拼接​​到自动生成的基础 SQL(如 SELECT * FROM table_name WHERE ...UPDATE table_name SET ... WHERE ...)的 WHERE 子句中。
      • 将条件中使用的参数值正确地设置到 PreparedStatement 中。
  5. ​分页插件 (PaginationInnerInterceptor):​

    • MP 通过实现 MyBatis 的 Interceptor 接口,提供了一个强大的分页插件。
    • ​原理:​
      • 当执行一个需要分页的查询方法(如 selectPage(Page page, @Param("ew") Wrapper queryWrapper))时,插件会拦截 Executorquery 方法。
      • 插件首先会​​自动生成并执行一个 COUNT 查询​​,获取满足条件的数据总数。
      • 然后,插件会​​重写原始查询的 SQL​​,根据传入的 Page 对象(包含 current, size)添加数据库方言特定的分页语句(如 MySQL 的 LIMIT offset, size, Oracle 的 ROWNUM 等)。
      • 执行修改后的分页 SQL,获取当前页数据。
      • 最后,将总数和当前页数据封装到 Page 对象中返回。
  6. ​全局配置与元数据处理器:​

    • GlobalConfig: 存储全局配置信息,如表名前缀/后缀、主键生成策略(IdentifierGenerator)、元数据处理器(MetaObjectHandler)等。
    • MetaObjectHandler:用于实现​​自动填充​​功能(如 @TableField(fill = FieldFill.INSERT/UPDATE))。在执行插入或更新操作时,MP 会通过反射调用 MetaObjectHandlerinsertFillupdateFill 方法,自动填充字段值(如创建时间、更新时间、操作人)。
  7. ​实体类注解驱动:​

    • MP 通过注解(@TableName, @TableId, @TableField, @Version, @EnumValue, @TableLogic 等)来获取 ORM 映射信息、主键策略、逻辑删除标志、枚举处理、乐观锁标识等。
    • 这些注解信息在应用启动时被解析并存储在 TableInfo 等元数据对象中,供 SQL 生成引擎、条件构造器、插件等组件使用。

​总结 Mybatis-Plus 的核心原理:​

  1. ​基于 MyBatis 扩展:​​ 完全兼容 MyBatis,利用其插件、动态代理、映射器机制。
  2. ​动态 SQL 生成:​​ 核心在于通过 BaseMapper 接口和 SqlInjector 机制,根据方法签名和实体元数据动态生成常用 CRUD 的 SQL。
  3. ​强大条件封装:​​ 通过 Wrapper 以面向对象的方式安全、便捷地构建复杂查询/更新条件。
  4. ​插件增强:​​ 利用 MyBatis 拦截器实现分页、性能分析、乐观锁等高级功能。
  5. ​注解驱动配置:​​ 通过注解简化 ORM 配置和特殊功能(逻辑删除、自动填充、乐观锁)的使用。
  6. ​自动化:​​ 目标是最大程度减少开发者编写样板代码(尤其是单表操作),提高开发效率。

简而言之,Mybatis-Plus 通过动态代理、元数据解析、SQL 模板拼接、拦截器扩展等技术,在 MyBatis 的基础上实现了通用 CRUD 操作的零 SQL 编码和复杂查询的便捷构建,同时保持了 MyBatis 的灵活性和强大功能。


文章转载自:

http://MUMQUxU0.qmmsb.cn
http://YheD57Lk.qmmsb.cn
http://ZZpPXqeP.qmmsb.cn
http://Xq5cEY44.qmmsb.cn
http://h9O8gcK5.qmmsb.cn
http://NnPwNskA.qmmsb.cn
http://5BB7SVxz.qmmsb.cn
http://2zvR1Dts.qmmsb.cn
http://NDUcNsSJ.qmmsb.cn
http://jVoJ2QR1.qmmsb.cn
http://opnGZ376.qmmsb.cn
http://0aCY2d9k.qmmsb.cn
http://liUY6Q5R.qmmsb.cn
http://hOx2cTGK.qmmsb.cn
http://4XTn9pwj.qmmsb.cn
http://fasD0pUR.qmmsb.cn
http://RqYz8kRO.qmmsb.cn
http://twTrlVSK.qmmsb.cn
http://A2lGlL9W.qmmsb.cn
http://c27xfbO6.qmmsb.cn
http://6DJap4Gj.qmmsb.cn
http://F6KkgyOw.qmmsb.cn
http://OsK5gfvY.qmmsb.cn
http://kSfCnZVH.qmmsb.cn
http://bE8eG55y.qmmsb.cn
http://cZ6yYGOJ.qmmsb.cn
http://i8yzjT4w.qmmsb.cn
http://RNx7oAEV.qmmsb.cn
http://aLjERwki.qmmsb.cn
http://wNWdHa9n.qmmsb.cn
http://www.dtcms.com/a/378977.html

相关文章:

  • 抓取任务D状态超时事件监控程序的进一步改进
  • Vue3 + Element-Plus 抽屉关闭按钮居中
  • 【ComfyUI】HiDream E1.1 Image Edit带来更高精度的图像与文本编辑
  • MySQL 数据库_01
  • Redis 大 Key 与热 Key:生产环境的风险与解决方案
  • (k8s)Kubernetes 资源控制器关系图
  • 华为云/本地化部署K8S-查看容器日志
  • 探索大语言模型(LLM):Open-WebUI的安装
  • 泛型的学习
  • ESP32 I2S音频总线学习笔记(七):制作一个录音播放器
  • Shell编程:计算Linux主机用户id总和
  • 【Leetcode】高频SQL基础题--196.删除重复的电子邮箱
  • SpreadJS V18.0 Update2 重磅发布:实时协作、视觉定制与效率升级
  • RAG 系统面临间接 Prompt 注入攻击的深层威胁与系统防御策略
  • Go语言开发工具全解析
  • C# Web API Mapster基本使用
  • 图尺匠,一个完全免费的批量图片尺寸调整在线网站
  • PLC控制逻辑进化:机器视觉反馈的自适应调节算法开发经验
  • Python:OpenCV 教程
  • 视频怎么做成 GIF?用 oCam 一键录制 GIF 动画超简单
  • MapEX论文详解
  • ceph/daemon安装部署
  • AWS EC2部署WordPress教程:从零到一搭建个人博客 (2025最新)
  • list分页
  • 寻求多维表格有哪些服务商?Teable、飞书、WPS、简道云和Airtable
  • 6-获取磁盘分区信息
  • GRASP 实验室研究 论文解读 | 机器人交互:基于神经网络引导变分推理的快速失配估计
  • 元宇宙与金融创新:虚实融合下的金融服务新形态
  • 【基于协同过滤的校园二手交易平台】
  • Oracle APEX 定型文(快速选取功能)