Mybatis 配置

参考: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 配置文件也可以复制到其他项目中复用,

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值