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

MyBatis-Plus 的加载及初始化

在 Spring Boot 启动过程中,MyBatis-Plus 的加载和初始化涉及多个阶段的工作。这些工作包括 MyBatis-Plus 自身的配置解析、Mapper 接口的扫描与注册、SQL 语句的动态注入以及底层 MyBatis 的初始化等。以下是对整个过程的详细分析:


1. Spring Boot 启动时对 MyBatis-Plus 的加载

Spring Boot 在启动时会对 MyBatis-Plus 进行自动配置(AutoConfiguration),并通过依赖注入的方式完成组件的初始化。以下是关键步骤:

(1)@EnableAutoConfiguration 和 MybatisPlusAutoConfiguration
  • Spring Boot 的核心特性是基于约定优于配置的原则,通过 @EnableAutoConfiguration 注解自动加载相关的 Starter 配置。
  • mybatis-plus-boot-starter 提供了 MybatisPlusAutoConfiguration 类,该类负责完成 MyBatis-Plus 的自动配置。
主要功能:
  • 数据源配置:加载 DataSource,并将其注入到 MyBatis 中。
  • SqlSessionFactory 初始化:创建 SqlSessionFactory 对象,用于管理 SQL 会话。
  • Mapper 扫描:扫描标注了 @Mapper 或被 @MapperScan 指定的包路径下的所有 Mapper 接口,并将其注册为 Spring 容器中的 Bean。
  • 全局配置:读取 application.yml 或 application.properties 中的 MyBatis-Plus 配置项(如分页插件、逻辑删除配置等)。
(2)MapperScannerConfigurer 的作用
  • MyBatis-Plus 使用 MapperScannerConfigurer 来扫描所有的 Mapper 接口。
  • 扫描到的每个 Mapper 接口都会被注册为一个 Spring Bean,并与底层的 MyBatis 映射器绑定。
(3)SqlSessionTemplate 和 SqlSession 的初始化
  • Spring Boot 会创建 SqlSessionTemplate,它是 MyBatis 的核心组件之一,用于执行 SQL 语句。
  • SqlSessionTemplate 内部封装了 SqlSession,并通过线程安全的方式管理数据库连接。

2. MyBatis-Plus 的加载和初始化

MyBatis-Plus 在 Spring Boot 启动时完成了自身的初始化工作,主要包括以下几个方面:

(1)全局配置加载

MyBatis-Plus 会从配置文件中读取全局配置项,例如:

  • 数据库字段命名规则(驼峰命名或下划线命名)。
  • 主键生成策略。
  • 字段自动填充策略。
  • 分页插件、逻辑删除插件等。

配置项通常通过 application.ymlapplication.properties 提供,例如:

yaml

mybatis-plus:global-config:db-config:table-underline: true  # 启用驼峰命名规则id-type: auto          # 主键生成策略
(2)Mapper 接口的动态代理

MyBatis-Plus 会为每个 Mapper 接口生成动态代理对象。这些代理对象实现了接口中定义的方法,并通过 MyBatis 的底层机制执行 SQL 操作。

动态代理的核心逻辑:
  • 方法拦截:当调用 Mapper 接口中的方法时,动态代理会拦截调用,并根据方法签名生成对应的 SQL 语句。
  • SQL 注入:如果启用了自定义 SQL 注入器(如 InsertBatchSomeColumn),则会在启动时将这些方法的 SQL 注入到 MyBatis 的 MappedStatement 中。
(3)SQL 方法的动态注入

MyBatis-Plus 提供了许多内置的通用方法(如 insertselectById 等),这些方法对应的 SQL 语句是在启动时动态生成并注入到 MyBatis 的 MappedStatement 中的。

动态注入的过程:
  1. 扫描 Mapper 接口:MyBatis-Plus 会扫描所有的 Mapper 接口,并为其注册默认的 SQL 方法。
  2. 生成 SQL 语句:对于每个方法,MyBatis-Plus 会根据方法签名和实体类的元信息(如表名、字段名)动态生成 SQL 语句。
  3. 注入 MappedStatement:生成的 SQL 语句会被注入到 MyBatis 的 MappedStatement 中,供后续执行使用。
(4)插件的初始化

MyBatis-Plus 提供了许多内置插件(如分页插件、逻辑删除插件等),这些插件会在启动时被初始化并注册到 MyBatis 的拦截器链中。

常见插件:
  • 分页插件(PaginationInterceptor):用于支持分页查询。
  • 逻辑删除插件(LogicSqlInjector):用于支持逻辑删除功能。
  • 性能分析插件(PerformanceInterceptor):用于分析 SQL 执行性能。

插件的初始化通常通过配置文件或代码显式注册,例如:

@Bean
public PaginationInterceptor paginationInterceptor() {return new PaginationInterceptor();
}


3. 底层 MyBatis 的初始化

MyBatis 是 MyBatis-Plus 的底层框架,因此 MyBatis-Plus 的初始化也依赖于 MyBatis 的核心机制。以下是 MyBatis 的初始化过程:

(1)SqlSessionFactory 的创建
  • SqlSessionFactory 是 MyBatis 的核心组件,用于创建 SqlSession 对象。
  • 在 Spring Boot 中,SqlSessionFactory 通常通过 SqlSessionFactoryBean 创建。
初始化流程:
  1. 加载 MyBatis 配置文件:读取 mybatis-config.xml 或通过 Java 配置类提供的配置项。
  2. 解析 Mapper XML 文件:如果存在 XML 格式的 Mapper 文件,MyBatis 会解析这些文件并将其中的 SQL 语句注册到 MappedStatement 中。
  3. 创建 SqlSessionFactory 实例:完成上述步骤后,SqlSessionFactory 被创建并注入到 Spring 容器中。
(2)MapperRegistry 的初始化
  • MapperRegistry 是 MyBatis 的一个内部组件,用于管理所有的 Mapper 接口。
  • 在启动时,MyBatis 会将所有的 Mapper 接口注册到 MapperRegistry 中。
(3)Configuration 的初始化
  • Configuration 是 MyBatis 的核心配置对象,包含所有的全局配置项和映射信息。
  • 在启动时,MyBatis 会初始化 Configuration 对象,并将所有的 MappedStatement、插件、类型处理器等注册到其中。

4. 总结:工作原理及底层逻辑

以下是 Spring Boot 启动时 MyBatis-Plus 的加载和初始化过程的总结:

  1. Spring Boot 自动配置

    • 加载 DataSource
    • 初始化 SqlSessionFactory
    • 扫描并注册 Mapper 接口。
  2. MyBatis-Plus 的初始化

    • 加载全局配置项。
    • 动态生成并注入 SQL 方法。
    • 初始化插件(如分页插件、逻辑删除插件)。
  3. MyBatis 的底层初始化

    • 创建 SqlSessionFactory
    • 解析 Mapper XML 文件。
    • 初始化 MapperRegistry 和 Configuration
  4. 运行时行为

    • 当调用 Mapper 接口中的方法时,动态代理会拦截调用,并通过 MyBatis 的底层机制执行 SQL 操作。

MyBatis-Plus 在 Spring Boot 启动时会完成实体类的基础 SQL(如 SELECTINSERTUPDATEDELETE 等)的组装和加载,并将这些 SQL 注册到 MyBatis 的 Mapper 映射中。这个过程可以理解为 提前初始化好基础 SQL,以便在运行时直接使用。

以下是详细的分析和工作原理:


1. 基础 SQL 的组装

MyBatis-Plus 通过动态生成的方式,为每个实体类生成一组通用的基础 SQL(即 CRUD 操作对应的 SQL)。这些 SQL 是基于实体类的注解(如 @TableName@TableField)以及全局配置(如字段命名规则、主键策略等)动态生成的。

(1)SQL 的生成逻辑

MyBatis-Plus 使用 AbstractMethod 类及其子类来定义每种 SQL 方法的生成逻辑。例如:

  • Insert 方法:生成插入语句(INSERT INTO table_name (column1, column2) VALUES (?, ?))。
  • SelectById 方法:生成根据主键查询的语句(SELECT * FROM table_name WHERE id = ?)。
  • Update 方法:生成更新语句(UPDATE table_name SET column1 = ?, column2 = ? WHERE id = ?)。
  • Delete 方法:生成删除语句(DELETE FROM table_name WHERE id = ?)。

这些方法的具体实现位于 com.baomidou.mybatisplus.core.injector.methods 包中。

(2)动态生成 SQL

MyBatis-Plus 会根据实体类的元信息(如表名、字段名、主键等)动态生成 SQL 语句。例如:

  • 如果实体类中有 @TableName("user") 注解,则生成的 SQL 中的表名为 user
  • 如果字段上有 @TableField("name") 注解,则生成的 SQL 中的字段名为 name
  • 如果启用了驼峰命名规则(table-underline: true),则会自动将字段名从驼峰命名转换为下划线命名。

2. SQL 的注册过程

生成的基础 SQL 会被注册到 MyBatis 的 MappedStatement 中,这是 MyBatis 的核心组件之一,用于存储 SQL 语句及其映射信息。

(1)什么是 MappedStatement

MappedStatement 是 MyBatis 的一个内部对象,用于描述一条 SQL 语句的执行细节,包括:

  • SQL 语句本身。
  • 参数类型。
  • 返回值类型。
  • 执行器类型(如 SIMPLEREUSEBATCH)。
(2)SQL 注册的流程

在 Spring Boot 启动时,MyBatis-Plus 会完成以下步骤:

  1. 扫描 Mapper 接口:通过 @MapperScan 或 MapperScannerConfigurer 扫描所有的 Mapper 接口。
  2. 生成 SQL:为每个 Mapper 接口中的方法动态生成 SQL 语句。
  3. 注册到 MappedStatement:将生成的 SQL 注册到 MyBatis 的 Configuration 对象中,并与对应的 Mapper 方法绑定。
示例:

假设有一个实体类 User 和对应的 UserMapper

@TableName("user")
public class User {private Long id;private String name;
}public interface UserMapper extends BaseMapper<User> {
}

在启动时,MyBatis-Plus 会为 UserMapper 注册以下基础 SQL:

  • SELECT * FROM user WHERE id = ?selectById 方法)
  • INSERT INTO user (id, name) VALUES (?, ?)insert 方法)
  • UPDATE user SET name = ? WHERE id = ?updateById 方法)
  • DELETE FROM user WHERE id = ?deleteById 方法)

这些 SQL 会被存储在 MappedStatement 中,并与 UserMapper 的方法绑定。


3. 提前初始化的好处

MyBatis-Plus 的这种提前初始化机制有以下好处:

(1)性能优化
  • 减少运行时开销:SQL 语句在启动时就已经生成并注册,运行时无需再动态生成 SQL,从而提高了执行效率。
  • 缓存复用MappedStatement 是 MyBatis 的缓存对象,同一 SQL 语句在多次调用时可以直接复用,避免重复解析。
(2)简化开发
  • 零配置:开发者无需手动编写 SQL 语句,MyBatis-Plus 会根据实体类自动生成基础 SQL。
  • 统一管理:所有基础 SQL 都由 MyBatis-Plus 统一生成和管理,减少了代码冗余和潜在错误。
(3)灵活性
  • 可扩展性:如果需要自定义 SQL 方法,可以通过实现 AbstractMethod 或自定义 SqlInjector 来扩展功能。
  • 插件支持:MyBatis-Plus 的插件机制(如分页插件、逻辑删除插件)可以在 SQL 注册过程中对生成的 SQL 进行增强或修改。

4. 动态代理与运行时行为

虽然基础 SQL 在启动时已经生成并注册,但实际的 SQL 执行是由 MyBatis 的动态代理机制完成的。以下是运行时的行为:

(1)动态代理拦截

当调用 Mapper 接口中的方法时,MyBatis 的动态代理会拦截调用,并根据方法签名找到对应的 MappedStatement

(2)参数绑定

MyBatis 会根据方法的参数类型和 SQL 中的占位符(?)进行参数绑定。例如:

java

User user = userMapper.selectById(1L);

在运行时,MyBatis 会将 1L 绑定到 SQL 中的 ?,生成最终的 SQL:

sql

SELECT * FROM user WHERE id = 1;

(3)执行 SQL

绑定参数后,MyBatis 会通过 SqlSession 执行 SQL,并返回结果。


5. 总结

  • SQL 的组装:MyBatis-Plus 在启动时会根据实体类的元信息动态生成基础 SQL(如 SELECTINSERTUPDATEDELETE 等)。
  • SQL 的注册:生成的 SQL 会被注册到 MyBatis 的 MappedStatement 中,并与 Mapper 方法绑定。
  • 提前初始化的好处:这种方式减少了运行时的开销,简化了开发,并提供了良好的灵活性和扩展性。

相关文章:

MyBatis-Plus 的加载及初始化

在 Spring Boot 启动过程中&#xff0c;MyBatis-Plus 的加载和初始化涉及多个阶段的工作。这些工作包括 MyBatis-Plus 自身的配置解析、Mapper 接口的扫描与注册、SQL 语句的动态注入以及底层 MyBatis 的初始化等。以下是对整个过程的详细分析&#xff1a; 1. Spring Boot 启动…...

HTML——什么是块级元素,什么是内联元素,有何区别

在 HTML 中&#xff0c;块级元素&#xff08;Block-level element&#xff09;和内联元素&#xff08;Inline element&#xff09;是两种不同类型元素&#xff0c;它们在页面布局和样式应用方面有不同的行为和特性。 块级元素&#xff08;Block-level element&#xff09; 块级…...

优先级与环境变量的艺术:驾驭 Linux 系统的核心

文章目录 前言一、什么是进程优先级&#xff1f;二、Linux 系统中的优先级2.1 查看进程优先级2.2 PRI 和 NI 的关系2.3 修改进程优先级2.4 进程优先级的实现原理2.5 进程的特性 三、环境变量3.1 PATH——搜索可执行文件的目录列表1. 为什么自己写的程序需要加 ./ 才能执行&…...

【AVRCP】深度剖析 AVRCP 中 Generic Access Profile 的要求与应用

目录 一、GAP基础架构与核心要求 1.1 GAP在蓝牙体系中的定位 1.2 核心模式定义 二、AVRCP对GAP的增强要求 2.1 模式扩展规范 2.2 空闲模式过程支持 三、安全机制实现细节 3.1 认证与加密流程 3.2 安全模式要求 四、设备发现与连接建立 4.1 发现过程状态机 4.2 连接…...

聊聊如何保障自动化测试的稳定性

目录 一、环境隔离与控制 二、 测试用例设计原则 三、处理异步和动态内容 四、依赖管理 五、错误处理与日志 六、持续集成&#xff08;CI&#xff09;与自动化流程 七 、监控与维护 八、团队协作与文化 在我们进行自动化测试的时候&#xff0c;可能会遇到一些测试环境不…...

如何在 Redis 中使用哈希(Hash)数据类型存储和管理对象数据的详细指南

精心整理了最新的面试资料和简历模板&#xff0c;有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 一、Redis 哈希数据类型简介 Redis 的 哈希&#xff08;Hash&#xff09; 是一种键值对集合&#xff0c;适合存储结构化对象&#xff08;如用户信息、商品数…...

如何在Spring Boot中设置HttpOnly Cookie以增强安全性

引言 在Web开发中,Cookie是用于在客户端和服务器之间传递信息的重要机制。然而,Cookie的安全性一直是一个备受关注的问题。特别是当Cookie中存储了敏感信息(如会话ID)时,如何防止这些信息被恶意脚本窃取就显得尤为重要。HttpOnly属性是增强Cookie安全性的一种有效手段。本…...

【AI学习笔记】Coze平台实现将Excel文档批量导入数据库全过程

背景前摇&原视频教程&#xff1a; 最近看到很多同学都在用Coze平台操作数据&#xff0c;我也想了解一下工作流的搭建和数据处理过程&#xff0c;但是一下子又看不懂太复杂的逻辑&#xff0c;于是上B站搜索相关的基础教程。 Coze官方教程&#xff1a; 之前有看过Coze平台…...

《可爱风格 2048 游戏项目:HTML 实现全解析》

一、引言 在如今的数字化时代&#xff0c;小游戏以其简单易上手、趣味性强的特点深受大家喜爱。2048 游戏作为一款经典的数字合并游戏&#xff0c;拥有庞大的玩家群体。本文将详细介绍一个用单文件 HTML 实现的可爱风格 2048 游戏项目&#xff0c;它不仅具备传统 2048 游戏的基…...

HR人员和组织信息同步AD域服务器实战方法JAVA

HR人员和组织信息同步AD域服务器 前期准备AD域基础知识整理HR同步AD的逻辑代码结构配置文件设置启动类HR组织的BeanHR人员Bean获取HR人员和组织信息的类AD中处理组织和人员的类日志配置 POM.xml文件生成EXE文件服务器定时任务异常问题注意事项 前期准备 1、开发语言&#xff1…...

java项目之基于ssm的毕业论文管理系统(源码+文档)

项目简介 毕业论文管理系统实现了以下功能&#xff1a; 本毕业论文管理系统主要实现的功能模块包括学生模块、导师模块和管理员模块三大部分&#xff0c;具体功能分析如下&#xff1a; &#xff08;1&#xff09;导师功能模块&#xff1a;导师注册登录后主要功能模块包括个人…...

深入C++:operator new与operator delete重载探秘

目录 一、C++ 内存管理初印象 二、operator new 和 operator delete 的基本原理 (一)operator new 的工作机制 (二)operator delete 的工作机制 三、为什么要重载 operator new 和 operator delete (一)优化内存分配效率 (二)实现自定义内存管理策略 四、如何重…...

4小时速通shell外加100例

&#x1f525; Shell 基础——从入门到精通 &#x1f680; &#x1f331; 第一章&#xff1a;Shell&#xff0c;简单说&#xff01; &#x1f476; 什么是Shell&#xff1f;它到底能做什么&#xff1f;这章让你快速了解Shell的强大之处&#xff01; &#x1f476; 什么是Shell…...

文字变央视级语音转换工具

大家在制作短视频、广告宣传、有声读物、自媒体配音、学习辅助等场景的时候&#xff0c;经常会需要用到配音来增强视频的表现力和吸引力。然而&#xff0c;市面上的一些配音软件往往需要收费&#xff0c;这对于很多初学者或者预算有限的朋友来说&#xff0c;无疑增加了一定的负…...

优先队列-小根堆留坑

给你一个整数数组 nums 和一个整数 k &#xff0c;请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。 示例 1: 输入: nums [1,1,1,2,2,3], k 2 输出: [1,2] 示例 2: 输入: nums [1], k 1 输出: [1] 提示&#xff1a; 1 < nums.length < 105 k 的…...

Vue 表单输入绑定,双向绑定

一、v-model 指令 用于Vue 表单双向绑定 用户Vue 组件属性双向绑定 v-model 还可以用于各种不同类型的输入&#xff0c;<textarea>、<select> 元素。它会根据所使用的元素自动使用对应的 DOM 属性和事件组合&#xff1a; 文本类型的 <input> 和 <text…...

日志2333

Pss-9 这一关考察的是时间盲注 先练习几个常见命令语句&#xff1a; select sleep(5);--延迟5s输出结果 if &#xff08;1>0,ture,false&#xff09;;--输出‘ture’ /if &#xff08;1<0,ture,false&#xff09;;--输出‘false’ select ascii()/select ord()返回字…...

spring MVC 介绍

Spring MVC 是 Spring 框架中用于构建 Web 应用的核心模块&#xff0c;基于 MVC 设计模式&#xff08;Model-View-Controller&#xff09;实现。以下是其核心概念的整理&#xff1a; 1. MVC 设计模式 • Model&#xff08;模型&#xff09;&#xff1a;封装业务数据和业务逻辑…...

计算机的基本组合和工作原理

计算机的基本组成和工作原理可以概括为以下几个核心部分&#xff1a; 一、计算机的基本组成&#xff08;冯诺依曼体系结构&#xff09; 现代计算机基于冯诺依曼体系结构&#xff0c;主要由以下五大部件组成&#xff1a; 控制器&#xff08;Control Unit, CU&#xff09; 功能&…...

美国国家数据浮标中心(NDBC)

No.大剑师精品GIS教程推荐0地图渲染基础- 【WebGL 教程】 - 【Canvas 教程】 - 【SVG 教程】 1Openlayers 【入门教程】 - 【源代码示例 300】 2Leaflet 【入门教程】 - 【源代码图文示例 150】 3MapboxGL【入门教程】 - 【源代码图文示例150】 4Cesium 【入门教程】…...

【计算机网络】网络简介

文章目录 1. 局域网与广域网1.1 局域网1.2 广域网 2. 路由器和交换机3. 五元组3.1 IP和端口3.2 协议3.3 协议分层 4. OSI七层网络协议5. TCP/IP五层模型5.1 TCP/IP模型介绍5.2 网络设备所在分层 6. 封装与分用6.1 数据包的称谓6.2 封装6.3 分用 1. 局域网与广域网 1.1 局域网 …...

Vue.js 模板语法全解析:从基础到实战应用

引言 在 Vue.js 的开发体系中&#xff0c;模板语法是构建用户界面的核心要素&#xff0c;它让开发者能够高效地将数据与 DOM 进行绑定&#xff0c;实现动态交互效果。通过对《Vue.js 快速入门实战》中关于 Vue 项目部署章节&#xff08;实际围绕 Vue 模板语法展开&#xff09;…...

python+ffmpeg给音频添加背景音乐

说明&#xff1a; 我希望用python&#xff0c;将name.mp3这段录音文件&#xff0c;添加背景音乐&#xff0c;bg.mp3&#xff0c;然后生成新的文件 step1: 添加依赖 pip install pydubstep2:下载ffmpeg 1.打开windows powershell &#xff0c;管理员运行 2.winget install ff…...

bootstrap 表格插件bootstrap table 的使用经验谈!

最近在开发一个物业管理软件&#xff0c;其中用到bootstrap 的模态框。同时需要获取表格数据。用传统的方法&#xff0c;本人不想用&#xff0c;考虑到bootstrap应该有获取表格数据的方法&#xff0c;结果发现要想实现获取表格数据功能&#xff0c;需要通过bootstrap的插件实现…...

Spring Boot框架识别

1. 通过icon图标进行识别 2、如果 web 应用开发者没有修改 SpringBoot Web 应用的默认 4xx、5xx 报错页面&#xff0c;那么当 web 应用程序出现 4xx、5xx 错误时&#xff0c;会报错如下图&#xff1a; 其他页面 工具一把梭哈...

【MySQL】【已解决】Windows安装MySQL8.0时的报错解决方案

一、引言 先说一些没用的话&#xff0c;据说安装MySQL是无数数据库初学者的噩梦&#xff0c;我在安装的时候也是查了很多资料&#xff0c;看了很多博客&#xff0c;但是很多毕竟每个人的电脑有各自不同的情况&#xff0c;大家的报错也不尽相同&#xff0c;所以也是很长时间之后…...

基于linux平台的C语言入门教程(7)类型转换

文章目录 1. 什么是类型转换&#xff1f;2. 隐式类型转换隐式类型转换的规则&#xff1a; 3. 显式类型转换显式类型转换的语法&#xff1a; 4. 示例代码代码解析&#xff1a;输出结果&#xff1a; 5. 常见问题问题 1&#xff1a;隐式类型转换会导致数据丢失吗&#xff1f;问题 …...

MES汽车零部件制造生产监控看板大屏

废话不多说&#xff0c;直接上效果 预览效果请在大的显示器查看&#xff0c;笔记本可能有点变形 MES汽车零部件制造生产监控看板大屏 纯html写的项目结构如下 主要代码分享 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UT…...

晶鑫股份迈向敏捷BI之路,永洪科技助力启程

数据驱动的时代&#xff0c;每一次技术的创新和突破都在为企业的发展注入新的动力。而敏捷性也不再是选择&#xff0c;是企业生存与发展的必要条件。作为连续5年获得中国敏捷BI第一名的永洪科技&#xff0c;通过不断地在数据技术领域深耕细作&#xff0c;再次迎来了行业内的关注…...

Browser Use Web UI 本地部署完全指南:从入门到精通

文章目录 引言一、项目概述1.1 核心功能1.2 技术特点 二、环境准备2.1 系统要求2.2 必要工具 三、详细部署步骤3.1 获取项目代码3.2 配置 Python 环境3.3 安装项目依赖3.4 环境配置3.5 启动应用 四、DeepSeek-V1 模型配置4.1 基础配置 五、执行Browser Use六、故障排查指南6.1 …...