MyBatis:核心配置文件

2022-12-01 21:31:58 浏览数 (1)

本篇内容包括:MyBatis 配置文件概述以及核心配置文件详解(configuration、properties、settings、typeAliases、typeHandlers、objectFactory等)的内容。

一、概述

Mybatis 配置文件两大类:1.Mybatis 主配置文件;2.Mybatis 的 mapper 文件

  1. Mybatis 主配置文件:提供 Mybatis 全局设置的。包含的内容、日志、数据源、mapper 文件位置等信息。
  2. Mybatis 的 mapper 文件:写 sql 语句的。一个表/Mapper接口一个 mapper 文件。

二、核心配置文件

核心配置文件 mybatis-config.xml,配置文件会影响 mybatis 的行为设置和属性信息

MyBatis 配置文档的顶层结构如下:

  • – configuration(配置)
  • – properties(属性)
  • ​ – property(属性信息)
  • – settings(设置)
  • – typeAliases(类型别名)
  • – typeHandlers(类型处理器)
  • – objectFactory(对象工厂)
  • – plugins(插件)
  • – environments(环境配置)
  • ​ – environment(环境变量)
  • ​ – transactionManager(事务管理器)
  • ​ – dataSource(数据源)
  • ​ – property(属性信息)
  • – databaseIdProvider(数据库厂商标识)
  • – mappers(映射器)

在配置文件里面添加这些配置,要按顺序来添加,不然会报错

1、properties(属性)

properties(属性)是用来加载配置文件或声明属性信息的,比如:

代码语言:javascript复制
    <properties resource="db.properties">
        <property name="username" value="dev_user"/>-->
        <property name="password" value="F2Fa3!33TYyg"/>-->
    </properties>
2、settings(设置)

在 MyBatis 中 settings 是最复杂的配置,它能深刻影响 MyBatis 底层的运行,但是在大部分情况下使用默认值便可以运行,所以在大部分情况下不需要大量配置它,只需要修改一些常用的规则即可,比如自动映射、驼峰命名映射、级联规则、是否启动缓存、执行器(Executor)类型等

配置项

作用

配置选项

默认值

cacheEnabled

该配置影响所有映射器中配置缓存的全局开关

true|false

true

lazyLoadingEnabled

延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。在特定关联关系中可通过设置 fetchType 属性来覆盖该项的开关状态

true|false

false

aggressiveLazyLoading

当启用时,对任意延迟属性的调用会使带有延迟加载属性的对象完整加载;反之,每种属性将会按需加载

true|felse

版本3.4.1 (不包含) 之前 true,之后 false

multipleResultSetsEnabled

是否允许单一语句返回多结果集(需要兼容驱动)

true|false

true

useColumnLabel

使用列标签代替列名。不同的驱动会有不同的表现,具体可参考相关驱动文档或通过测试这两种不同的模式来观察所用驱动的结果

true|false

true

useGeneratedKeys

允许JDBC 支持自动生成主键,需要驱动兼容。如果设置为 true,则这个设置强制使用自动生成主键,尽管一些驱动不能兼容但仍可正常工作(比如 Derby)

true|false

false

autoMappingBehavior

指定 MyBatis 应如何自动映射列到字段或属性。 NONE 表示取消自动映射。 PARTIAL 表示只会自动映射,没有定义嵌套结果集和映射结果集。 FULL 会自动映射任意复杂的结果集(无论是否嵌套)

NONE、PARTIAL、FULL

PARTIAL

autoMappingUnkno wnColumnBehavior

指定自动映射当中未知列(或未知属性类型)时的行为。 默认是不处理,只有当日志级别达到 WARN 级别或者以下,才会显示相关日志,如果处理失败会抛出 SqlSessionException 异常

NONE、WARNING、FAILING

NONE

defaultExecutorType

配置默认的执行器。SIMPLE 是普通的执行器;REUSE 会重用预处理语句(prepared statements);BATCH 执行器将重用语句并执行批量更新

SIMPLE、REUSE、BATCH

SIMPLE

defaultStatementTimeout

设置超时时间,它决定驱动等待数据库响应的秒数

任何正整数

Not Set (null)

defaultFetchSize

设置数据库驱动程序默认返回的条数限制,此参数可以重新设置

任何正整数

Not Set (null)

safeRowBoundsEnabled

允许在嵌套语句中使用分页(RowBounds)。如果允许,设置 false

true|false

false

safeResultHandlerEnabled

允许在嵌套语句中使用分页(ResultHandler)。如果允许,设置false

true|false

true

mapUnderscoreToCamelCase

是否开启自动驼峰命名规则映射,即从经典数据库列名 A_COLUMN 到经典 Java 属性名 aColumn 的类似映射

true|false

false

localCacheScope

MyBatis 利用本地缓存机制(Local Cache)防止循环引用(circular references)和加速联复嵌套査询。 默认值为 SESSION,这种情况下会缓存一个会话中执行的所有查询。若设置值为 STATEMENT,本地会话仅用在语句执行上,对相同 SqlScssion 的不同调用将不会共享数据

SESSION|STATEMENT

SESSION

jdbcTypeForNull

当没有为参数提供特定的 JDBC 类型时,为空值指定 JDBC 类型。某些驱动需要指定列的 JDBC 类型,多数情况直接用一般类型即可,比如 NULL、VARCHAR 或 OTHER

NULL、VARCHAR、OTHER

OTHER

lazyLoadTriggerMethods

指定哪个对象的方法触发一次延迟加载

equals、clone、hashCode、toString

defaultScriptingLanguage

指定动态 SQL 生成的默认语言

org.apache.ibatis .script.ing.xmltags .XMLDynamicLanguageDriver

callSettersOnNulls

指定当结果集中值为 null 时,是否调用映射对象的 setter(map 对象时为 put)方法,这对于 Map.kcySet() 依赖或 null 值初始化时是有用的。注意,基本类型(int、boolean 等)不能设置成 null

true|false

false

logPrefix

指定 MyBatis 增加到日志名称的前缀

任何字符串

Not set

loglmpl

指定 MyBatis 所用日志的具体实现,未指定时将自动査找

SLF4J | LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING

Not set

proxyFactory

指定 MyBatis 创建具有延迟加栽能力的对象所用到的代理工具

CGLIB|JAVASSIST

JAVASSIST (MyBatis 版本为 3.3 及以上的)

vfsImpl

指定 VFS 的实现类

提供 VFS 类的全限定名,如果存在多个,可以使用逗号分隔

Not set

useActualParamName

允许用方法参数中声明的实际名称引用参数。要使用此功能,项目必须被编译为 Java 8 参数的选择。(从版本 3.4.1 开始可以使用)

true|false

true

3、typeAliases(类型别名)

类型别名可为 Java 类型设置一个缩写名字。 它仅用于 XML 配置,意在降低冗余的全限定类名书写

在Mybatis核心配置文件中配置(将Java类的全路径替换成一个别名,在xml使用):

代码语言:javascript复制
    <typeAliases>
        <typeAlias alias="User" type="com.hjxlog.domain.User"/>
    </typeAliases>

也可以指定一个包名,MyBatis 会在包名下面搜索需要的 Java Bean,使用 Bean 的首字母小写的非限定类名来作为它的别名:

代码语言:javascript复制
    <typeAliases>
        <package name="com.lizhengi.domain"/>
    </typeAliases>

使用注解的形式起别名:

代码语言:javascript复制
@Alias("theUser")
public class User {}
代码语言:javascript复制
    <select id="selectUserList" resultType="theUser">
        select * from public.user
    </select>

其中,mybatis 核心配置文件中配置优先级最高,开启包扫描后,如果还有另外配置注解,则以注解为准。

Ps:Java类型的别名,如果在前面加下划线_,映射的是基本类型,如果没有加下划线,映射的是包装类型。

4、typeHandlers(类型处理器)

由于Java 类型和数据库的 JDBC 类型不是一一对应的(比如 String 与 varchar), 所以我们把 Java 对象转换为数据库的值,和把数据库的值转换成 Java 对象,需要经过 一定的转换,这两个方向的转换就要用到 TypeHandler。我们平时没有做任何关于 TypeHandler 的配置,为什么实体类对象里面的 String 属性,可以保存成数据库里面的 varchar 字段或者保存成 char 字段呢,这是因为 MyBatis 中已经内置了很多 TypeHandler。

typeHandlers(类型处理器)标签是用来重写或者自定义类型处理器的。

5、objectFactory(对象工厂)

当我们把数据库返回的结果集转换为实体类的时候,需要创建对象的实例,由于我 们不知道需要处理的类型是什么,有哪些属性,所以不能用 new 的方式去创建。在 MyBatis 里面,它提供了一个工厂类的接口,叫做 ObjectFactory,专门用来创建对象的实例。

typeHandlers(类型处理器)标签是用来重写或者自定义类型对象工厂的。

6、plugins(插件)

MyBatis 可以使用第三方的插件来对功能进行扩展,比如分页助手 PageHelper 是将分页的复杂操作进行封装,使用简单的方式即可获得分页的相关数据。

代码语言:javascript复制
<!--配置分页助手插件-->
    <plugins>
        <plugin interceptor="com.github.pagehelper.PageHelper">
            <property name="dialect" value="mysql"></property>
        </plugin>
    </plugins>
7、environments(环境配置)

mybatis 可以配置多套环境使用,将 SQL 映射到不同的数据库中。比如开发、测试和生产环境的数据库不同,需要不同的配置。但是,尽管可以配置多个环境,但每个 SqlSessionFactory 实例只能选择一种环境。有多少个环境,就需要多少个 SqlSessionFactory 实例。

代码语言:javascript复制
		<!--    default为默认使用的环境    -->
    <environments default="development">
				<!--   id为development的环境    -->
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="org.postgresql.Driver"/>
                <property name="url" value="jdbc:postgresql://127.0.0.1:5432/postgres?useSSL=false"/>
                <property name="username" value="postgres"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
				<!--    id为test的环境    -->
        <environment id="test">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED"></dataSource>
            ...
        </environment>
    </environments>

事务管理器(transactionManager)有两种配置: type=“[JDBC|MANAGED]”

  • JDBC:使用了 JDBC 的提交和回滚设施。
  • MANAGED : 这个配置几乎没做什么。它从不提交或回滚一个连接,而是让容器来管理事务的整个生命周期。

数据源(dataSource) 有三种类型:type=“[UNPOOLED|POOLED|JNDI]”

  • UNPOOLED – 这个数据源的实现会每次请求时打开和关闭连接。
  • POOLED – 这种数据源的实现利用“池”的概念将 JDBC 连接对象组织起来,避免了创建新的连接实例时所必需的初始化和认证时间。默认的是这个。
  • JNDI – 这个数据源实现是为了能在如 EJB 或应用服务器这类容器中使用。
8、databaseIdProvider(数据库厂商标识)

MyBatis 可以根据不同的数据库厂商执行不同的语句,这种多厂商的支持是基于映射语句中的 databaseId 属性。

MyBatis 会加载不带 databaseId 属性和带有匹配当前数据库 databaseId 属性的所有语句。 如果同时找到带有 databaseId 和不带 databaseId 的相同语句,则后者会被舍弃。 为支持多厂商特性只要像下面这样在 mybatis-config.xml 文件中加入 databaseIdProvider 即可:

代码语言:javascript复制
<databaseIdProvider type="DB_VENDOR" />

这里的 DB_VENDOR 会通过 DatabaseMetaData#getDatabaseProductName() 返回的字符串进行设置。 由于通常情况下这个字符串都非常长而且相同产品的不同版本会返回不同的值,所以最好通过设置属性别名来使其变短,如下:

代码语言:javascript复制
<databaseIdProvider type="DB_VENDOR">
  <property name="SQL Server" value="sqlserver"/>
  <property name="DB2" value="db2"/>        
  <property name="Oracle" value="oracle" />
</databaseIdProvider>
9、mappers(映射器)

映射器就是告诉 MyBatis 到哪里去找到这些语句。

方式一:

代码语言:javascript复制
<!-- 使用相对于类路径的资源引用 -->
<mappers>
  <mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
  <mapper resource="org/mybatis/builder/BlogMapper.xml"/>
</mappers>

方式二:

代码语言:javascript复制
<!-- 使用完全限定资源定位符(URL) -->
<mappers>
  <mapper url="file:///var/mappers/AuthorMapper.xml"/>
  <mapper url="file:///var/mappers/BlogMapper.xml"/>
</mappers>

方式三:

代码语言:javascript复制
<mappers>
  <mapper class="org.mybatis.builder.AuthorMapper"/>
  <mapper class="org.mybatis.builder.BlogMapper"/>
</mappers>

注意:1.接口和mapper文件必须同名,2.接口和mapper文件在同一个包下

方式四:

代码语言:javascript复制
<!-- 将包内的映射器接口实现全部注册为映射器 -->
<mappers>
  <package name="org.mybatis.builder"/>
</mappers>

0 人点赞