在 Spring Boot 启动过程中,MyBatis-Plus 的加载和初始化涉及多个阶段的工作。这些工作包括 MyBatis-Plus 自身的配置解析、Mapper 接口的扫描与注册、SQL 语句的动态注入以及底层 MyBatis 的初始化等。以下是对整个过程的详细分析:
Spring Boot 在启动时会对 MyBatis-Plus 进行自动配置(AutoConfiguration),并通过依赖注入的方式完成组件的初始化。以下是关键步骤:
@EnableAutoConfiguration
和 MybatisPlusAutoConfiguration
@EnableAutoConfiguration
注解自动加载相关的 Starter 配置。mybatis-plus-boot-starter
提供了 MybatisPlusAutoConfiguration
类,该类负责完成 MyBatis-Plus 的自动配置。DataSource
,并将其注入到 MyBatis 中。SqlSessionFactory
对象,用于管理 SQL 会话。@Mapper
或被 @MapperScan
指定的包路径下的所有 Mapper 接口,并将其注册为 Spring 容器中的 Bean。application.yml
或 application.properties
中的 MyBatis-Plus 配置项(如分页插件、逻辑删除配置等)。MapperScannerConfigurer
的作用MapperScannerConfigurer
来扫描所有的 Mapper 接口。SqlSessionTemplate
和 SqlSession
的初始化SqlSessionTemplate
,它是 MyBatis 的核心组件之一,用于执行 SQL 语句。SqlSessionTemplate
内部封装了 SqlSession
,并通过线程安全的方式管理数据库连接。MyBatis-Plus 在 Spring Boot 启动时完成了自身的初始化工作,主要包括以下几个方面:
MyBatis-Plus 会从配置文件中读取全局配置项,例如:
配置项通常通过 application.yml
或 application.properties
提供,例如:
yaml
mybatis-plus:
global-config:
db-config:
table-underline: true # 启用驼峰命名规则
id-type: auto # 主键生成策略
MyBatis-Plus 会为每个 Mapper 接口生成动态代理对象。这些代理对象实现了接口中定义的方法,并通过 MyBatis 的底层机制执行 SQL 操作。
InsertBatchSomeColumn
),则会在启动时将这些方法的 SQL 注入到 MyBatis 的 MappedStatement
中。MyBatis-Plus 提供了许多内置的通用方法(如 insert
、selectById
等),这些方法对应的 SQL 语句是在启动时动态生成并注入到 MyBatis 的 MappedStatement
中的。
MappedStatement
:生成的 SQL 语句会被注入到 MyBatis 的 MappedStatement
中,供后续执行使用。MyBatis-Plus 提供了许多内置插件(如分页插件、逻辑删除插件等),这些插件会在启动时被初始化并注册到 MyBatis 的拦截器链中。
插件的初始化通常通过配置文件或代码显式注册,例如:
@Bean
public PaginationInterceptor paginationInterceptor() {
return new PaginationInterceptor();
}
MyBatis 是 MyBatis-Plus 的底层框架,因此 MyBatis-Plus 的初始化也依赖于 MyBatis 的核心机制。以下是 MyBatis 的初始化过程:
SqlSessionFactory
的创建SqlSessionFactory
是 MyBatis 的核心组件,用于创建 SqlSession
对象。SqlSessionFactory
通常通过 SqlSessionFactoryBean
创建。mybatis-config.xml
或通过 Java 配置类提供的配置项。MappedStatement
中。SqlSessionFactory
实例:完成上述步骤后,SqlSessionFactory
被创建并注入到 Spring 容器中。MapperRegistry
的初始化MapperRegistry
是 MyBatis 的一个内部组件,用于管理所有的 Mapper 接口。MapperRegistry
中。Configuration
的初始化Configuration
是 MyBatis 的核心配置对象,包含所有的全局配置项和映射信息。Configuration
对象,并将所有的 MappedStatement
、插件、类型处理器等注册到其中。以下是 Spring Boot 启动时 MyBatis-Plus 的加载和初始化过程的总结:
Spring Boot 自动配置:
DataSource
。SqlSessionFactory
。MyBatis-Plus 的初始化:
MyBatis 的底层初始化:
SqlSessionFactory
。MapperRegistry
和 Configuration
。运行时行为:
MyBatis-Plus 在 Spring Boot 启动时会完成实体类的基础 SQL(如 SELECT
、INSERT
、UPDATE
、DELETE
等)的组装和加载,并将这些 SQL 注册到 MyBatis 的 Mapper
映射中。这个过程可以理解为 提前初始化好基础 SQL,以便在运行时直接使用。
以下是详细的分析和工作原理:
MyBatis-Plus 通过动态生成的方式,为每个实体类生成一组通用的基础 SQL(即 CRUD 操作对应的 SQL)。这些 SQL 是基于实体类的注解(如 @TableName
和 @TableField
)以及全局配置(如字段命名规则、主键策略等)动态生成的。
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
包中。
MyBatis-Plus 会根据实体类的元信息(如表名、字段名、主键等)动态生成 SQL 语句。例如:
@TableName("user")
注解,则生成的 SQL 中的表名为 user
。@TableField("name")
注解,则生成的 SQL 中的字段名为 name
。table-underline: true
),则会自动将字段名从驼峰命名转换为下划线命名。生成的基础 SQL 会被注册到 MyBatis 的 MappedStatement
中,这是 MyBatis 的核心组件之一,用于存储 SQL 语句及其映射信息。
MappedStatement
?MappedStatement
是 MyBatis 的一个内部对象,用于描述一条 SQL 语句的执行细节,包括:
SIMPLE
、REUSE
、BATCH
)。在 Spring Boot 启动时,MyBatis-Plus 会完成以下步骤:
@MapperScan
或 MapperScannerConfigurer
扫描所有的 Mapper 接口。MappedStatement
:将生成的 SQL 注册到 MyBatis 的 Configuration
对象中,并与对应的 Mapper
方法绑定。假设有一个实体类 User
和对应的 UserMapper
:
@TableName("user")
public class User {
private Long id;
private String name;
}
public interface UserMapper extends BaseMapper {
}
在启动时,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
的方法绑定。
MyBatis-Plus 的这种提前初始化机制有以下好处:
MappedStatement
是 MyBatis 的缓存对象,同一 SQL 语句在多次调用时可以直接复用,避免重复解析。AbstractMethod
或自定义 SqlInjector
来扩展功能。虽然基础 SQL 在启动时已经生成并注册,但实际的 SQL 执行是由 MyBatis 的动态代理机制完成的。以下是运行时的行为:
当调用 Mapper
接口中的方法时,MyBatis 的动态代理会拦截调用,并根据方法签名找到对应的 MappedStatement
。
MyBatis 会根据方法的参数类型和 SQL 中的占位符(?
)进行参数绑定。例如:
java
User user = userMapper.selectById(1L);
在运行时,MyBatis 会将 1L
绑定到 SQL 中的 ?
,生成最终的 SQL:
sql
SELECT * FROM user WHERE id = 1;
绑定参数后,MyBatis 会通过 SqlSession
执行 SQL,并返回结果。
SELECT
、INSERT
、UPDATE
、DELETE
等)。MappedStatement
中,并与 Mapper
方法绑定。