您现在的位置是:首页 >技术交流 >MyBatis - Spring Boot 集成 MyBatis网站首页技术交流
MyBatis - Spring Boot 集成 MyBatis
MyBatis-Spring-Boot-Starter 可以帮助你更快地在 Spring Boot 之上构建 MyBatis 应用。通过使用该模块我们能够快速实现以下目的:
- 构建单体应用程序
- 将几乎不需要样板配置
- 使用更少的 XML 配置
1.版本要求
MyBatis-Spring-Boot-Starter 要求以下版本:
MyBatis-Spring-Boot-Starter | MyBatis-Spring | Spring Boot | Java |
---|---|---|---|
3.0 | 3.0 | 3.0 - 3.1 | 17 或更高 |
2.3 | 2.1 | 2.5 - 2.7 | 8 或更高 |
从上面的版本要求,我们们也不难发现,在 Spring Boot 3.x 发布后,MyBatis Starter 也进行了兼容性适配,在 Spring Boot 3.x 项目中我们可以使用 mybatis-spring-boot-starter 3.x 的版本。
2.导入依赖
Spring Boot 官方没有提供 MyBatis Starter,但是 MyBatis 官方提供了 mybatis-spring-boot-starter 一站式启动器。如果你使用 Maven,要使用 MyBatis-Spring-Boot-Starter 模块,你只需要在你的 pom.xml
添加以下依赖:
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>${mybatis-starter.version}</version>
</dependency>
具体使用哪个版本的 MyBatis 依赖需要根据实际情况进行选择,然后对应替换上例中的 ${mybatis-starter.version}
部分。对应的你可以到 Maven 中央仓库进行查阅:Maven Repository:mybatis-spring-boot-starter。
3.自动配置
当我们导入 mybatis-spring-boot-starter
,它就同时导入了使用 MyBatis 所需的所有依赖:
在 org.mybatis.spring.boot.autoconfigure
的自动配置文件中也包含了 Spring Boot 使用 MyBatis 时所需的自动配置,对应的自动配置类为 MyBatisAutoConfiguration
,它代替了传统 Spring 项目集成 MyBatis 所需的 XML 配置文件。
自动配置类 MyBatisAutoConfiguration
主要负责 SqlSessionFactory
和 SqlSessionTemplate
两个实例的创建和注册。
SqlSessionFactory
: 这是 MyBatis 的核心类,用于创建SqlSession
对象。它存储了执行 SQL 命令所需的所有配置信息。Spring Boot 通过SqlSessionFactoryBean
创建SqlSessionFactory
,并自动将数据源、事务管理器、配置属性等所需的依赖注入其中。SqlSessionTemplate
: 这是SqlSession
的线程安全的实现,代表了与数据库的一次会话。在 Spring 管理的事务中,SqlSessionTemplate
可以确保使用的是同一个SqlSession
。SqlSessionTemplate
实例由 Spring Boot 在创建SqlSessionFactory
后自动创建并注册,将SqlSessionFactory
作为参数传递给其构造函数。
对应的源码如下:
// MyBatis自动配置类
@Configuration
@ConditionalOnClass({SqlSessionFactory.class, SqlSessionFactoryBean.class})
@ConditionalOnSingleCandidate(DataSource.class) // 单一数据源
@EnableConfigurationProperties({MybatisProperties.class}) // 参数绑定配置类
@AutoConfigureAfter({DataSourceAutoConfiguration.class, MybatisLanguageDriverAutoConfiguration.class})
public class MybatisAutoConfiguration implements InitializingBean {
// 配置SqlSessionFactory
@Bean
@ConditionalOnMissingBean
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
// ......
}
// 配置SqlSessionTemplate
@Bean
@ConditionalOnMissingBean
public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {
ExecutorType executorType = this.properties.getExecutorType();
return executorType != null ? new SqlSessionTemplate(sqlSessionFactory, executorType) : new SqlSessionTemplate(sqlSessionFactory);
}
// ......
}
注意:从上述源码中不难看出,
SqlSessionFactory
需要一个DataSource
(数据源)。这可以是任意的DataSource
,只需要和配置其它 Spring 数据库连接一样配置它就可以了。
对应的参数绑定配置类为 MyBatisProperties
,通过一系列 mybatis.*
参数就可以自定义 MyBatis 配置。
2.可配置项
MybatisProperties
参数绑定配置类源码如下:
@ConfigurationProperties(prefix = "mybatis") // 指定前缀为 mybatis
public class MybatisProperties {
public static final String MYBATIS_PREFIX = "mybatis";
private static final ResourcePatternResolver resourceResolver = new PathMatchingResourcePatternResolver();
private String configLocation;
private String[] mapperLocations;
private String typeAliasesPackage;
private Class<?> typeAliasesSuperType;
private String typeHandlersPackage;
private boolean checkConfigLocation = false;
private ExecutorType executorType;
private Class<? extends LanguageDriver> defaultScriptingLanguageDriver;
private Properties configurationProperties;
@NestedConfigurationProperty
// 核心配置
private Configuration configuration;
// ......
}
下表是基于上述源码整理的常用 mybatis.*
配置参数:
配置项 | 说明 |
---|---|
mybatis.config-location | MyBatis 的配置文件位置(默认扫描 CLASSPATH 路径) |
mybatis.mapper-locations | MyBatis 映射文件的位置,支持通配符 |
mybatis.type-aliases-package | MyBatis 实体类别名的包路径 |
mybatis.type-handlers-package | 类型映射所需的 TypeHandler 放置的包路径 |
从源码中还可以看到,其中提供了一个 CoreConfiguration
类型的配置属性,这是一个内部类,其中定义了对应于 MyBatis 的核心配置文件的内容,源码如下:
public static class CoreConfiguration {
private Boolean safeRowBoundsEnabled;
private Boolean safeResultHandlerEnabled;
private Boolean mapUnderscoreToCamelCase;
private Boolean aggressiveLazyLoading;
private Boolean multipleResultSetsEnabled;
private Boolean useGeneratedKeys;
private Boolean useColumnLabel;
private Boolean cacheEnabled;
private Boolean callSettersOnNulls;
private Boolean useActualParamName;
private Boolean returnInstanceForEmptyRow;
private Boolean shrinkWhitespacesInSql;
private Boolean nullableOnForEach;
private Boolean argNameBasedConstructorAutoMapping;
private Boolean lazyLoadingEnabled;
private Integer defaultStatementTimeout;
private Integer defaultFetchSize;
private LocalCacheScope localCacheScope;
private JdbcType jdbcTypeForNull;
private ResultSetType defaultResultSetType;
private ExecutorType defaultExecutorType;
private AutoMappingBehavior autoMappingBehavior;
private AutoMappingUnknownColumnBehavior autoMappingUnknownColumnBehavior;
private String logPrefix;
private Set<String> lazyLoadTriggerMethods;
private Class<? extends Log> logImpl;
private Class<? extends VFS> vfsImpl;
private Class<?> defaultSqlProviderType;
Class<? extends TypeHandler> defaultEnumTypeHandler;
private Class<?> configurationFactory;
private Properties variables;
// ......
}
其实这就对应了 MyBatis 官方文档中的 XML 配置部分,需要时直接进行查阅即可:mybatis – MyBatis 3 | 配置
下表是基于上述源码整理的常用 mybatis.configuration.*
配置参数:
配置项 | 说明 |
---|---|
mybatis.configuration.default-statement-timeout | 设置默认语句超时时间,它决定数据库驱动等待数据库响应的秒数。 |
mybatis.configuration.map-underscore-to-camel-case | 是否开启驼峰命名自动映射,即从经典数据库列名 A_COLUMN 映射到经典 Java 属性名 aColumn。 |
注意:以上两个配置项不能和
mybatis.config-location
一起使用。
例如,在我们项目的 application 配置文件里就可以像下面这样做配置:
mybatis:
type-handlers-package: cn.javgo.demo.support.handler
type-aliases-package: cn.javgo.demo.model
configuration:
map-underscore-to-camel-case: true