参考:https://mybatis.org/mybatis-3/configuration.html
依赖
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.0</version>
</dependency>
在 Mybatis 官方网站的介绍里面,所有的配置项如下:
properties
properties
配置项可以引入外部配置文件,主要用来引入数据库连接配置文件,但是现在的 springboot 开发中一般在 application.yml 文件中配置数据库连接信息,所以这个配置在开发中用不到,这里直接忽略它。
settings
这个配置项下面有很多子配置项,这些子配置项决定了 Mybatis 在运行时的行为方式,非常重要。
<settings>
<!--启用 mapper 下的缓存,默认为 true-->
<setting name="cacheEnabled" value="true"/>
<!--启用懒加载,默认为 false-->
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="aggressiveLazyLoading" value="true"/>
<!--允许一个 statement 返回多个结果集,默认为 true-->
<setting name="multipleResultSetsEnabled" value="true"/>
<!--使用列表标签代替列名,不同的数据库驱动的行为不同,参考驱动文档或者测试结果来决定用什么配置,默认为 true-->
<setting name="useColumnLabel" value="true"/>
<!--允许 JDBC 支持主键生成,默认为 false-->
<setting name="useGeneratedKeys" value="true"/>
<!--指定MyBatis是否应自动将列映射到字段/属性。NONE 用自动映射。PARTIAL 将仅自动映射结果,内部没有嵌套结果映射。FULL 将自动映射结果映射的任何复杂性(包含嵌套或其他)-->
<setting name="autoMappingBehavior" value="PARTIAL"/>
<!--上面两个配置参数是全局配置,在每个 mapper 语句中还可以配置,建议在每个 mapper 中按需配置-->
<!--MyBatis 自动映射时未知列或未知属性处理策略,通过该配置可指定 MyBatis 在自动映射过程中遇到未知列或者未知属性时如何处理,总共有 3 种可选值
NONE:不做任何处理 (默认值)
WARNING:以日志的形式打印相关警告信息
FAILING:当作映射失败处理,并抛出异常和详细信息
默认为 NONE
-->
<setting name="autoMappingUnknownColumnBehavior" value="NONE"/>
<!--配置默认的 executor,
SIMPLE 类型的执行器不做任何特殊处理,
REUSE 类型执行器复用 prepared statements,
BATCH 类型执行器复用 statements 和 batches updates
默认值为 SIMPLE-->
<setting name="defaultExecutorType" value="SIMPLE"/>
<!--设置等待数据库返回信息的时间,单位为秒,默认没有配置-->
<setting name="defaultStatementTimeout" value="10000"/>
<!--为驱动程序设置一个提示,以控制返回结果的获取大小。默认没有设置,此参数值可由查询设置覆盖,建议在每个 mapper 中按需配置-->
<setting name="defaultFetchSize" value="10000"/>
<!--指定滚动策略,默认没有设置-->
<setting name="defaultResultSetType" value="DEFAULT"/>
<!--允许在嵌套语句中使用 RowBounds,如果允许,设置为 false,默认为 false-->
<setting name="safeRowBoundsEnabled" value="false"/>
<!--允许在嵌套语句中使用 ResultHandler,如果允许,设置为 false,默认为 true-->
<setting name="safeResultHandlerEnabled" value="true"/>
<!--Mybatis 使用本地缓存来防止循环引用并加快重复的嵌套查询。
默认情况下(会话)会在会话期间执行所有查询。
如果LocalCachesCope = STATEMENT 本地会话仅用于语句执行,
则在对同一SQLSession的两个不同调用之间不会共享数据-->
<setting name="localCacheScope" value="SESSION"/>
<!--指定哪个对象方法触发懒加载,默认值为 equals,clone,hashCode,toString-->
<setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>
<!--指定默认情况下用于动态SQL生成的语言,默认值 org.apache.ibatis.scripting.xmltags.XMLLanguageDriver-->
<setting name="defaultScriptingLanguage" value="org.apache.ibatis.scripting.xmltags.XMLLanguageDriver"/>
<!--指定当检索值为 null,setter 方法或者 map 的 put 方法是否会调用,当你依靠 map.keyset() 或 null 值初始化时,它很有用,默认值为 false-->
<setting name="callSettersOnNulls" value="false"/>
<!--指定 Mybatis 将用于创建懒加载对象的代理工具,默认为 JAVASSIST,可选值:CGLIB | JAVASSIST-->
<setting name="proxyFactory" value="JAVASSIST "/>
<!--指定 VFS 实现,默认没有设置-->
<setting name="vfsImpl" value=""/>
<!--允许在方法签名中通过其实际名称来引用语句参数,要使用此功能,你的项目必须在 Java 8 中编译,并带有 `-parameters` 选项,默认为 ture-->
<setting name="useActualParamName" value="true"/>
<!--指定提供配置实例的类,返回的配置实例用于加载 deserialized 对象的延迟属性,该类必须有一个签名为 `static Configuration getConfiguration()` 的方法,默认没有设置-->
<setting name="configurationFactory" value=""/>
<!--从 SQL 中删除额外的空白字符,请注意,这也会影响 SQL 中的文本字符串,默认为 false-->
<setting name="shrinkWhitespacesInSql" value="false"/>
<!--指定持有提供商方法的 SQL 提供商类,此类适用于 SQL 提供商注释上的类型属性,默认没有设置-->
<setting name="defaultSqlProviderType" value=""/>
<!--指定 foreach 标签上的空属性的默认值,默认为 false-->
<setting name="nullableOnForEach" value=""/>
<!--以上配置并不经常用到,在工作中这些配置可以默认-->
<!--指定未为参数提供特定 JDBC 类型时设置 JDBC 类型为空。
某些驱动程序需要指定列的 JDBC 类型,但其他驱动程序使用空值,varchar或其他泛型值-->
<setting name="jdbcTypeForNull" value="OTHER"/>
<!--指定用于处理 Enum 类型的 TypeHandler, 默认值是 org.apache.ibatis.type.EnumTypeHandler-->
<setting name="defaultEnumTypeHandler" value="org.apache.ibatis.type.EnumTypeHandler"/>
<!--指定 Mybatis 将添加到 logger 名称的前缀字符串, 默认没有删除-->
<setting name="logPrefix" value="mybatis"/>
<!--指定 Mybatis 使用哪个日志实现,如果没有指定将会自动发现日志实现,默认没有设置
可用值:
SLF4J | LOG4J(deprecated since 3.5.9) | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING-->
<setting name="logImpl" value="SLF4J"/>
<!--默认情况下,Mybatis 在返回行的所有列为 null 时返回 null,启用此设置后,MyBatis 改为返回一个空的实例。请注意,它也适用于嵌套结果,默认为 false-->
<setting name="returnInstanceForEmptyRow" value="true"/>
<!--是否开启自动驼峰命名规则(camel case)映射,默认为 false-->
<setting name="mapUnderscoreToCamelCase" value="true"/>
<!--常用的配置有上面 6 个,mybatis-config.xml 指定这些配置即可-->
</settings>
常用的只有 6 个,其他的在需要时查阅即可
typeAliases
<!--配置扫描类型别名,可以指定包名或者类的全限定名,推荐指定包名,一般用来指定 PO 类的包-->
<typeAliases>
<package name="com.monkey.domain"/>
</typeAliases>
typeHandler
<!-- 配置扫描自定义类型处理器的包名或者类名 -->
<typeHandlers>
<typeHandler handler="org.mybatis.example.ExampleTypeHandler"/>
</typeHandlers>
objectFactory
每次 Mybatis 创建一个 result 对象,它使用 ObjectFactory 实例执行此操作,默认的 ObjectFactory 仅仅是使用默认构造函数实例化目标类,
或者在有参数映射的时候用有参数构造函数。如果你想要覆盖默认 ObjectFactory 的行为,可以自定义 ObjectFactory:
// ExampleObjectFactory.java
public class ExampleObjectFactory extends DefaultObjectFactory {
@Override
public <T> T create(Class<T> type) {
return super.create(type);
}
@Override
public <T> T create(Class<T> type, List<Class<?>> constructorArgTypes, List<Object> constructorArgs) {
return super.create(type, constructorArgTypes, constructorArgs);
}
@Override
public void setProperties(Properties properties) {
super.setProperties(properties);
}
@Override
public <T> boolean isCollection(Class<T> type) {
return Collection.class.isAssignableFrom(type);
}}
<!-- mybatis-config.xml -->
<objectFactory type="org.mybatis.example.ExampleObjectFactory">
<property name="someProperty" value="100"/>
</objectFactory>
ObjectFactory 接口非常简单,它包含两个创建方法,一种用于处理默认构造函数,另一种用于处理参数化的构造函数。
最后,可以使用 setProperties
方法来配置对象属性。
plugins
<!--配置扫描自定义插件/拦截器的包名或者类名-->
<plugins>
<plugin interceptor="org.mybatis.example.ExamplePlugin">
<property name="someProperty" value="100"/>
</plugin>
</plugins>
environments
该属性用来配置数据库连接对象和事务管理,如今这两个都在 Spring 中管理了,所以基本可以忽略。
databaseIdProvider
Mybatis 可以根据不同的数据库厂商执行不同的语句,这种多厂商的支持是基于映射语句中的 databaseId
属性,MyBatis 会加载带有匹配当前数据库 databaseId
属性和所有不带 databaseId
属性的语句。
如果同时找到带有 databaseId
和不带 databaseId
的相同语句,则后者会被舍弃。为支持多厂商特性,只要像下面这样在 mybatis-config.xml 文件中加入 databaseIdProvider
即可:
<databaseIdProvider type="DB_VENDOR" />
databaseIdProvider 对应的 DB_VENDOR 实现会将 databaseId 设置为 DatabaseMetaData#getDatabaseProductName()
返回的字符串。由于通常情况下这些字符串都非常长,而且相同产品的不同版本会返回不同的值,你可能想通过设置属性别名来使其变短:
<databaseIdProvider type="DB_VENDOR">
<property name="SQL Server" value="sqlserver"/>
<property name="DB2" value="db2"/>
<property name="Oracle" value="oracle" />
</databaseIdProvider>
在提供了属性别名时,databaseProvider
的 DB_VENDOR 实现会将 databaseId 设置为数据库产品名与属性中的名称第一个相匹配的值,如果没有匹配的属性,将会设置为 null
。
在这个例子中,如果 getDatabaseProductName()
返回 “Oracle(DataDirect)”,databaseId 将被设置为 “oracle”。
你可以通过实现接口 org.apache.ibatis.mapping.DatabaseIdProvider
并在 mybatis-config.xml 中注册来构建自己的 DatabaseIdProvider:
public interface DatabaseIdProvider {
default void setProperties(Properties p) { // 从 3.5.2 开始,该方法为默认方法
// 空实现
}
String getDatabaseId(DataSource dataSource) throws SQLException;
}
该属性一般情况下也不需要配置
mappers
该配置用于告诉 Mybatis 到哪里扫描 mapper 接口和 mapper xml 映射文件。
mapper 接口我们一般都用 @Mapper
注解标识让 Spring 帮我们扫描。
对于 xml 映射文件,该配置只能一个文件一个文件的配置,所以
在我们使用 Spring Boot Mybatis 的情况下,推荐在 application.yml 文件中使用 mapper.mapper-locations
来配置 xml 映射文件路径
比如:
# mybatis 配置
mybatis:
# 配置文件路径
config-location: classpath:mybatis-config.xml
# 检查配置文件
check-config-location: true
# xml 映射文件路径
mapper-locations: classpath:mapperxml/**/*.xml
总结
在使用 Spring Boot Mybatis 时,最好把 Mybatis 的配置写到 xml 配置文件中,
这样可以和 application.xml 解耦,结构更清晰。
同时 xml 配置文件也可以复制到其他项目中复用,