​核心关系:​​ MyBatis-Plus ​​不是​​ MyBatis 的替代品,而是构建在 MyBatis ​​之上​​的一个强大的​​增强工具包​​。它完全兼容原生 MyBatis,并在其基础上提供了大量开箱即用的功能,极大地简化了开发,尤其是单表操作。


​一、 MyBatis 核心原理​

MyBatis 的核心思想是将 ​​SQL 语句从 Java 代码中解耦​​,通过配置或注解来管理 SQL,并提供灵活的 ORM 映射。其核心原理围绕以下几个关键组件和流程:

  1. SqlSessionFactoryBuilder & SqlSessionFactory:​

    • ​作用:​​ 应用启动时,读取 MyBatis 的全局配置文件 (mybatis-config.xml) 和所有的 Mapper XML 文件(或注解配置)。
    • ​原理:​SqlSessionFactoryBuilder 解析这些配置文件,构建出包含所有配置信息(数据源、事务管理器、类型处理器、插件、Mapper 注册信息等)的 Configuration 对象,并最终创建出 SqlSessionFactorySqlSessionFactory 是生产 SqlSession 的工厂。
  2. SqlSession:​

    • ​作用:​​ 代表一次与数据库的会话。它是 MyBatis 工作的​​核心入口​​。
    • ​原理:​​ 通过 SqlSessionFactory.openSession() 获取。它提供了执行 SQL 命令(selectOne, selectList, insert, update, delete)、获取 Mapper 接口代理对象、管理事务等方法。每个 SqlSession 通常对应一个数据库连接(或连接池中的一个连接)。
  3. Executor:​

    • ​作用:​SqlSession 内部真正​​执行 SQL 操作​​的组件。
    • ​原理:​SqlSession 将请求委托给 ExecutorExecutor 负责维护一级缓存(SqlSession 级别)、处理延迟加载、调用 StatementHandler 等。常见的实现有 SimpleExecutor(每次执行创建新 Statement)、ReuseExecutor(重用 Statement)、BatchExecutor(批处理)。
  4. StatementHandler:​

    • ​作用:​​ 负责​​创建 JDBC Statement 对象​​(PreparedStatement, CallableStatement, Statement),并​​设置参数​​、​​执行 SQL​​。
    • ​原理:​Executor 调用 StatementHandler。它使用 ParameterHandler 将 Java 对象参数设置到 SQL 的占位符 (?) 上。
  5. ParameterHandler:​

    • ​作用:​​ 负责将​​用户传入的 Java 参数​​,按照 SQL 语句中的占位符 (?) 进行​​类型转换和设置​​。
    • ​原理:​​ 利用注册的 TypeHandler 完成 Java 类型到 JDBC 类型的转换。
  6. TypeHandler:​

    • ​作用:​​ 负责 ​​Java 类型和 JDBC 类型之间的相互转换​​。
    • ​原理:​​ MyBatis 内置了常用类型(如 String, Integer, Date 等)的处理器。用户可以自定义处理器处理特殊类型(如枚举)。
  7. ResultSetHandler:​

    • ​作用:​​ 负责将 JDBC ResultSet 返回的结果集​​转换​​为​​指定的 Java 对象​​(单个对象、List、Map 等)。
    • ​原理:​​ 根据 Mapper 方法定义的返回类型(或 resultMap 配置),利用 TypeHandler 和反射,将结果集的每一行数据映射成 Java 对象。
  8. MappedStatement:​

    • ​作用:​​ 代表一个映射的 SQL 语句。它是 MyBatis 配置的核心单元。
    • ​原理:​​ 存储了 SQL 语句本身(<select>, <insert> 等标签的内容)、参数映射信息 (<parameterMap>@Param)、结果映射信息 (<resultMap>@Result)、SQL 命令类型(SELECT/INSERT 等)、缓存配置等。一个 Mapper 接口方法对应一个 MappedStatement
  9. ​配置方式:​

    • ​XML 配置:​​ 主要方式。通过 mybatis-config.xml 配置全局设置,通过 Mapper.xml 文件定义 SQL 和映射关系。
    • ​注解配置:​​ 在 Mapper 接口方法上使用 @Select, @Insert, @Update, @Delete, @Results 等注解直接编写 SQL 和映射规则。通常用于简单 SQL。

​MyBatis 工作流程总结:​

  1. 应用启动:解析配置 -> 构建 Configuration -> 创建 SqlSessionFactory
  2. 业务请求:SqlSessionFactory -> 创建 SqlSession
  3. 执行操作:
    • 通过 SqlSession 直接执行 SQL 方法 (selectOne, update 等)。
    • 或通过 SqlSession.getMapper() 获取 Mapper 接口的​​动态代理对象​​。
  4. 代理对象调用:代理对象根据方法名找到对应的 MappedStatement
  5. Executor 执行:Executor 根据 MappedStatement 信息,调用 StatementHandler 创建 Statement
  6. ParameterHandler 设置参数。
  7. StatementHandler 执行 SQL。
  8. ResultSetHandler 处理结果集,映射为 Java 对象。
  9. 返回结果。

​优点:​​ 灵活、SQL 可控性强、与 JDBC 解耦、支持复杂映射、插件扩展性强。
​缺点:​​ 需要编写大量 SQL 和 XML/注解(尤其是简单 CRUD)、配置繁琐。


​二、 MyBatis-Plus (MP) 核心原理​

MP 的核心原理是在 ​​MyBatis 原有架构和机制的基础上​​,通过一系列封装、扩展和自动化技术,​​极大地简化单表操作和常用功能开发​​。它没有改变 MyBatis 的核心流程,而是增强了它。

  1. ​核心增强点:BaseMapperSqlInjector / AbstractMethod

    • ​原理:​​ MP 的核心创新。用户 Mapper 接口只需继承 BaseMapper。在应用启动时,MP 的 SqlInjector (如 DefaultSqlInjector) 会扫描这些 Mapper。
    • ​动态 SQL 生成:​​ 对于 BaseMapper 中的每个方法(insert, selectById, update 等),MP 都有一个对应的 AbstractMethod 子类(如 Insert, SelectById, Update)。这些子类在启动时,利用实体类的元数据 (TableInfo,由 @TableName, @TableId 等注解解析而来) 和预定义的 SQL 模板 (SqlMethod),​​动态生成​​该方法的完整 SQL 语句和 MappedStatement 对象,并注册到 MyBatis 的 Configuration 中。
    • ​结果:​​ 开发者无需为这些通用方法编写任何 SQL 或 XML,MP 自动提供实现。
  2. ​强大的条件构造器 (Wrapper)​

    • ​原理:​​ 提供 QueryWrapper, UpdateWrapper, LambdaQueryWrapper 等。用户通过链式调用构建复杂的查询/更新条件(eq, like, between, set 等)。
    • ​SQL 拼接:​Wrapper 内部将条件表达式存储为结构化的数据。当 Wrapper 被用于查询或更新方法时,MP 的 SQL 生成引擎会安全地(防止 SQL 注入)将这些条件​​解析并拼接到自动生成的基础 SQL 的 WHERE 子句或 SET 部分​​。
  3. ​自动配置与 Starter (Spring Boot)​

    • ​原理:​​ 提供 mybatis-plus-boot-starter。利用 Spring Boot 自动配置机制,自动创建和配置 DataSource, SqlSessionFactoryBean(注入 MP 的核心组件如 GlobalConfig, Interceptor), MapperScannerConfigurer 等,大大简化了集成步骤。
  4. ​插件体系增强​

    • ​原理:​​ 继承并扩展 MyBatis 的 Interceptor 接口,提供功能更强大、开箱即用的内置插件:
      • PaginationInnerInterceptor: 自动处理物理分页(生成 COUNT 查询和分页 SQL)。
      • OptimisticLockerInnerInterceptor: 自动实现乐观锁(基于 @Version 注解)。
      • BlockAttackInnerInterceptor: 防止全表更新/删除(安全防护)。
      • DynamicTableNameInnerInterceptor: 动态表名。
      • IllegalSQLInnerInterceptor: SQL 性能分析/阻止恶意 SQL。
    • ​工作方式:​​ 这些插件在 MyBatis 的执行流程(主要是 Executor 阶段)进行拦截,添加额外功能。
  5. ​全局配置与元数据处理​

    • GlobalConfig: 存储全局配置(表前缀、主键生成器策略、元对象处理器等)。
    • MetaObjectHandler: 实现​​自动填充​​功能(@TableField(fill = ...))。在插入或更新时,通过反射自动填充字段(如 createTime, updateTime)。
  6. ​注解驱动增强​

    • ​原理:​​ 在 MyBatis 注解基础上,提供更丰富的 ORM 和功能注解:
      • @TableName: 指定表名。
      • @TableId: 指定主键及策略(自增、UUID、雪花ID等)。
      • @TableField: 指定字段映射、自动填充策略、是否存在等。
      • @Version: 乐观锁版本字段。
      • @EnumValue: 枚举值映射。
      • @TableLogic: 逻辑删除标记。
      • @SqlParser: 过滤 SQL 解析(用于跳过某些拦截器)。
    • 这些注解信息在启动时被解析并存储在 TableInfo 等元数据对象中,供 SQL 生成、条件构造、插件等使用。

​MP 工作流程总结:​

  1. ​启动阶段:​
    • 自动配置(Spring Boot Starter)。
    • 扫描实体类注解,构建 TableInfo 等元数据。
    • 扫描 Mapper 接口(继承 BaseMapper)。
    • SqlInjectorBaseMapper 的每个方法注入对应的 AbstractMethod 实现。
    • AbstractMethod 子类利用元数据和 SQL 模板,动态生成 MappedStatement 并注册。
    • 配置并添加 MP 的内置插件到 InterceptorChain
  2. ​运行时阶段:​
    • 与原生 MyBatis 流程基本相同(SqlSession -> Executor -> ...)。
    • 当调用 BaseMapper 方法时,执行的是 MP 动态生成的 MappedStatement
    • 当使用 Wrapper 时,MP 在生成 SQL 时会解析并拼接 Wrapper 的条件。
    • MP 的插件在相应执行点进行拦截,提供分页、乐观锁等功能。

​优点:​​ 极大简化 CRUD、减少 SQL/XML 编写、内置强大功能(分页、代码生成器、乐观锁、逻辑删除等)、增强条件构造、提高开发效率。
​缺点:​​ 对复杂 SQL 和多表关联查询的支持不如直接手写 SQL/XML 灵活(虽然也能用),需要学习 MP 特有的 API 和注解。


​三、 MyBatis vs MyBatis-Plus 核心对比总结​

特性MyBatisMyBatis-Plus (MP)说明
​定位​灵活的 SQL 映射框架MyBatis 的增强工具包MP 基于 MyBatis,不是替代品。
​核心目标​SQL 与代码解耦,灵活控制 SQL​简化开发​​,尤其是单表 CRUDMP 专注于减少样板代码。
​SQL 编写​​必需​​ (XML 或注解)​可选​​ (对单表 CRUD 自动生成)MP 的 BaseMapper 自动提供通用方法实现。复杂 SQL 仍需手写。
​CRUD 实现​手动编写每个 CRUD 方法的 SQL 和映射​自动实现​BaseMapper 中的通用 CRUD 方法MP 的核心优势,省去大量简单 SQL 编写。
​条件构造​手动拼接 SQL 条件字符串 (易错,不安全)强大的 ​Wrapper API​​ (链式调用,类型安全 - LambdaWrapper,防注入)MP 提供面向对象的、安全的条件构建方式。
​分页​需手动编写分页 SQL (不同数据库语法不同)内置 ​PaginationInterceptor​ (自动物理分页)MP 的分页插件自动处理不同数据库方言、COUNT 查询和数据获取。
​主键生成​需在 SQL 或配置中处理支持多种策略 (@TableId),内置分配器 (雪花ID等)MP 简化了主键管理。
​逻辑删除​需手动在 SQL 中添加条件内置支持 (@TableLogic),自动添加过滤条件MP 自动在查询/更新中处理逻辑删除字段。
​乐观锁​需手动实现版本控制逻辑内置支持 (@Version),通过插件自动处理MP 简化了乐观锁实现。
​自动填充​需手动在代码中设置内置支持 (@TableField(fill) + MetaObjectHandler)MP 自动填充如创建时间、更新时间等字段。
​代码生成器​无官方提供,需用第三方或自研提供功能强大的 ​​代码生成器​MP 可快速生成 Entity, Mapper, Service, Controller 等基础代码。
​安全防护​无内置提供 ​BlockAttackInnerInterceptor​ 等安全插件MP 防止全表更新/删除等危险操作。
​配置复杂度​相对较高 (需配置较多 XML/注解)​显著降低​​ (尤其结合 Spring Boot Starter)MP 的自动配置和默认行为减少了大量配置。
​学习曲线​掌握 SQL/XML 映射和核心组件即可需额外学习 MP 特有的 API (Wrapper, BaseMapper), 注解和插件MP 增加了自己的抽象层。
​灵活性​​极高​​,完全掌控 SQL对单表操作灵活,对​​复杂 SQL/多表​​ 灵活性相对降低MP 处理复杂场景时,有时仍需回退到原生 MyBatis 方式 (手写 SQL/XML)。
​适用场景​需要极致 SQL 控制、复杂查询、存储过程调用快速开发、大量单表操作、需要内置功能 (分页/乐观锁等)两者并非互斥,可在同一项目中结合使用。

​总结:​

  • ​MyBatis:​​ 是​​基础​​,提供了灵活、强大的 SQL 映射能力,将开发者从 JDBC 的繁琐中解放出来,但需要编写大量 SQL 和配置。
  • ​MyBatis-Plus:​​ 是​​增强​​,在 MyBatis 的基础上,通过自动化生成、强大的条件构造器、丰富的内置功能(分页、代码生成、乐观锁等)和便捷的配置(特别是 Spring Boot),​​极大地提升了开发效率,尤其擅长处理单表操作​​。它保留了 MyBatis 的灵活性,对于复杂场景,你仍然可以像使用原生 MyBatis 一样编写自定义 SQL。

​选择建议:​

  • 如果你的项目有​​大量简单的单表 CRUD 操作​​,追求​​开发效率​​,且需要​​分页、乐观锁​​等常见功能,​​MyBatis-Plus 是绝佳选择​​。
  • 如果你的项目​​极其复杂​​,涉及大量​​定制化 SQL、存储过程、复杂的多表关联和嵌套查询​​,或者你对 SQL 有​​绝对的控制欲​​,​​原生 MyBatis 可能更合适​​(或者结合使用,复杂部分用原生)。
  • ​实际项目中,两者结合使用非常常见:​​ 简单 CRUD 用 MP 的 BaseMapperWrapper,复杂查询或存储过程调用则使用原生 MyBatis 的 XML 或注解方式编写 SQL。MP 的 @SqlParser(filter=true) 可以让你在同一个 Mapper 中混合使用这两种方式。

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025胶水分装机服务商技术解析:聚焦高精度、智能化应用

胶水作为电子组装、新能源电池、医疗器械、消费类电子产品等关键环节中的核心材料&#xff0c;其生产、储存与分装过程对精度、洁净度和一致性的要求日益严苛。在这一背景下&#xff0c;胶水分装机及分装服务商正从传统的设备供应商向“工艺装备数据服务”的综合解决方案提供者…

v-model是怎么实现的,语法糖到底是什么

1&#xff1a;作用在表单元素上实际上就是2&#xff1a;作用在自定义组件上&#xff0c;vue2和vue3不同 vue2&#xff1a; v-model相当于名为value 的 prop和名为 input 的事件 在父组件中 <child v-model"message"></child> //相当于&#xff1a; <…

学习笔记:Javascript(5)——事件监听(用户交互)

事件监听&#xff1a;用户交互的核心机制在前端开发中&#xff0c;事件监听是处理用户交互的基础机制。它允许我们检测用户的操作&#xff08;如点击、输入、滚动等&#xff09;并执行相应的代码&#xff0c;让网页从静态变为动态。一、事件与事件监听的基本概念事件&#xff0…

在Linux系统中清理大文件的方法

在Linux系统的日常运维管理过程中&#xff0c;磁盘空间问题是一个非常常见且棘手的难题。随着系统运行时间的增加&#xff0c;日志文件、临时文件、缓存文件以及用户产生的数据会不断增长。如果缺乏及时的监控和清理&#xff0c;大文件往往会迅速占满磁盘&#xff0c;导致系统性…

使用x64dbg分析调试windows可执行程序

引言 当我们仅有一个C/C等编译的可执行程序&#xff08;windows 上的 exe 文件&#xff09;&#xff0c;而没有源码时我们应该怎么分析调试该可执行程序呢&#xff1f;我们可以通过动态分析或静态分析的方式达成我们的目的&#xff0c;当然比较有效的方案当然是静态分析结合动态…

在Windows 11上配置Cursor IDE进行Java开发

前言 Cursor IDE是一款基于VSCode的AI编程助手&#xff0c;集成了强大的AI功能&#xff0c;能够显著提升Java开发效率。本文详细介绍如何在Windows 11系统上安装和配置Cursor IDE&#xff0c;使其成为高效的Java开发环境。 1. Windows 11上安装Cursor IDE 1.1 下载和安装步骤…

字符串-43.字符串相乘-力扣(LeetCode)

一、题目解析 1、计算乘积后&#xff0c;将结果也按字符串返回 2、字符串长度在[1&#xff0c;200] 二、算法原理 为了方便字符串计算&#xff0c;我们将其逆置&#xff0c;符合我们的计算需求&#xff0c;"123"将变为"321" 解法1&#xff1a;模拟小学…

鸿蒙HAP包解包、打包、签名及加固全流程解析

在鸿蒙应用开发过程中&#xff0c;HAP&#xff08;HarmonyOS Ability Package&#xff09;包的解包、打包、签名以及加固是开发者们绕不开的重要环节。今天&#xff0c;就让我们深入探讨这一全流程&#xff0c;帮助大家更好地理解和掌握相关操作。 一、HAP解包 解包是分析和修…

PyTorch之张量创建与运算

PyTorch 主要有以下几个基础概念&#xff1a;张量&#xff08;Tensor&#xff09;、自动求导&#xff08;Autograd&#xff09;、神经网络模块&#xff08;nn.Module&#xff09;、优化器&#xff08;optim&#xff09;等。张量&#xff08;Tensor&#xff09;&#xff1a;PyTo…

数据 储存

文件储存 网页版爬虫数据库 &#xff1a; https://spidertools.cn/#/crypto TEXT 文本储存 可以使用记事本打开 r #读取。 r #读写&#xff0c;文件指针放在文件的开头。 w #写入&#xff0c;覆盖原文件。 w #读写&#xff0c;覆盖原文件。 a #附加。 a #读写&…

Flask 博客系统(Flask Blog System)

目标&#xff1a;零基础也能从头搭建一个支持文章管理、评论、分类标签、搜索、用户登录的博客系统 技术栈&#xff1a;Flask SQLite SQLAlchemy Jinja2 HTML/CSS Flask-Login 开发工具&#xff1a;VSCode 学习重点&#xff1a;MVC 模式、数据库操作、会话管理、表单处理一…

基于RFID技术的宠物自动喂食器方案

一、背景 宠物已经成为现代人生活中不可或缺的一部分&#xff0c;随着养宠物的人越来越多&#xff0c;宠物的数量也越来越多&#xff0c;有些家庭甚至养了两只以上的猫狗或者猫狗混养&#xff0c;宠物间的管理问题也越来越突出&#xff0c;如宠物之间的抢食行为&#xff0c;易…

conda常见问题

文章目录run "conda init" before "conda activate"打开PowerShell自动进入base环境&#xff08;cmd没有这个问题&#xff09;run “conda init” before “conda activate” 在使用conda命令创建env后使用conda activate命令&#xff0c;出现"run ‘…

第5章 HTTPS与安全配置

5.1 HTTPS概述 5.1.1 为什么需要HTTPS 数据加密:保护传输中的敏感数据 身份验证:确认服务器身份的真实性 数据完整性:防止数据在传输过程中被篡改 SEO优势:搜索引擎优先排名HTTPS网站 浏览器要求:现代浏览器对HTTP网站显示不安全警告 合规要求:许多行业标准要求使用HTTP…

Java入门级教程17——利用Java SPI机制制作验证码、利用Java RMI机制实现分布式登录验证系统

目录 1.制作验证码——java SPI机制 1.1 类所属包情况 1.2 具体实现 1.2.1 核心接口&#xff1a;ICode 1.2.2 接口实现类&#xff1a;验证码的具体生成逻辑 1.2.3 服务工厂类&#xff1a;CodeServiceFactory&#xff08;核心&#xff1a;SPI 服务发现&#xff09; 1.2.…

ES6笔记5

1. Promise相当于一个容器&#xff0c;保存着未来才要结束的事件&#xff08;异步操作&#xff09;的一个结果&#xff0c;各种异步操作都可以用同样方法处理 axios特点&#xff1a;对象的状态不受外界影响&#xff0c;处理异步操作&#xff0c;3个状态&#xff0c;Pending&…

解决idea2021maven依赖导入后还是找不到包,爆红无法导入

1.依赖导入后pom.xml文件以及Maven,此两处代码还是爆红 2.解决方法 由技术大佬同事几分钟解决,他记忆深刻之前搞过很久,一看就知道哪里出问题了 我之前是配过Maven的本地仓库的但是没有用,这次出问题之后长教训了,技术大佬说尽量用自己的本地仓库,不要用idea的Maven仓库,容易…

【硬件-笔试面试题-81】硬件/电子工程师,笔试面试题(知识点:详细讲讲同步时钟与异步时钟通信)

题目汇总版--链接&#xff1a; 【硬件-笔试面试题】硬件/电子工程师&#xff0c;笔试面试题汇总版&#xff0c;持续更新学习&#xff0c;加油&#xff01;&#xff01;&#xff01;-CSDN博客 【硬件-笔试面试题-81】硬件/电子工程师&#xff0c;笔试面试题&#xff08;知识点…

php计算一个模拟增长过程函数

private function calculateGrowth($progress) {// 使用多个增长阶段模拟不均匀性if ($progress < 0.3) {// 前30%时间&#xff1a;缓慢增长 30 %return pow($progress / 0.3, 0.7) * 0.3;} elseif ($progress < 0.7) {// 中间40%时间&#xff1a;快速增长 50%return 0.3…

华为USG6000v2 NAT模式下IPSEC IKE V1 实验

USG6000v2 NAT模式下IPSEC 实验 拓扑图公网配置OSPF路由协议&#xff08;网络要求能通就行&#xff09; 一、 总部配置 &#xff08;一&#xff09;交换机配置 1、 总部交换机到防火墙网段 192.168.10.0/24 2、 交换机G0/0设置成access端口划分vlan 10&#xff0c;网关 192.168…