1、全局配置文件SqlMapConfig
1.1 全局配置文件SqlMapConfig配置项
在使用MyBatis框架时,最重要的一步就是配置项目工程的全局参数信息,以及数据库连接信息,这些配置信息均在全局配置文件SqlMapConfig.xml中。除此之外,该配置文件中还包含了SQL应神剑的加载路径、全局参数以及类型别名等一系列MyBatis的核心配置信息。SqlMapConfig中的配置信息必须严格按照格式标准进行配置。
全局配置文件SqlMapConfig.xml中各个配置项的名称、含义及描述如下表:
配置名称 | 配置含义 | 配置简介 |
---|---|---|
configuration | 包裹所有配置标签 | 整个配置文件的顶级标签 |
properties | 属性 | 该标签可以引入外部配置的属性,也可以自己配置。该配置标签所在的同一个配置文件的其他配置均可以引用此配置中的属性 |
setting | 全局配置参数 | 用来配置一些改变运行时行为的信息,例如是否使用缓存机制,是否使用延迟加载,是否使用错误处理机制等。并且可以设置最大并发请求数量、最大并发事务数量,以及是否启用命名空间等 |
typeAliases | 类型别名 | 用来设置一些别名来代替Java的长类型声明(如java.lang.int变为int),减少配置编码的冗余 |
typeHandlers | 类型处理器 | 将SQL中返回的数据库类型转换为相应的Java类型的处理器配置 |
objectFactory | 对象工厂 | 实例化目标类的工厂类配置 |
plugins | 插件 | 可以通过插件修改MyBatis的核心行为,例如对语句执行的某一点进行拦截调用 |
environments | 环境集合属性对象 | 数据库环境信息的集合。在一个配置文件中,可以有多种数据库环境集合,这样可以使MyBatis将SQL同时映射至多个数据库 |
environment | 环境子属性对象 | 数据库环境配置的详细配置 |
transactionManager | 事务管理 | 指定MyBatis的事务管理器 |
dataSource | 数据源 | 使用其中的type指定数据源的连接类型,在标签对中可以使用property属性指定数据库连接池的其他信息 |
mappers | 映射器 | 配置SQL映射文件的位置,告知MyBatis去哪里加载SQL映射文件 |
按照MyBatis的全局配置文件中的配置顺序,下面给出一个配置了全部参数的样例配置文件,配置文件仅供参考,具体示例配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--1、properties属性引入外部配置文件:注册DB连接四要素的属性文件-->
<properties resource="jdbc.properties" />
<!--2、全局参数设置-->
<settings>
<!-- 配置LOG信息 -->
<setting name="logImpl" value="LOG4J" />
<!-- 延迟加载总开关 -->
<setting name="lazyLoadingEnabled" value="true"/>
<!-- 侵入式延迟加载开关 -->
<setting name="aggressiveLazyLoading" value="true"/>
<!-- 关闭二级查询缓存 -->
<!--<setting name="cacheEnabled" value="false" />-->
</settings>
<!--3、配置别名-->
<typeAliases>
<package name="com.ccff.mybatis.model"/>
</typeAliases>
<!--4、配置类型转换器-->
<typeHandlers>
<!--一个简单类型转换器-->
<typeHandler handler="org.mybatis.example.ExampleTypeHandler" />
</typeHandlers>
<!--5、对象工厂-->
<objectFactory type="org.mybatis.example.ExampleObjectFactory">
<!--对象工厂注入的参数-->
<property name="someProperty" value="100" />
</objectFactory>
<!--6、插件-->
<plugins>
<plugin interceptor="org.mybatis.example.ExamplePlugin">
<property name="someProperty" value="100" />
</plugin>
</plugins>
<!-- 7、environments数据库环境配置:和spring整合后 environments配置将废除-->
<environments default="development">
<environment id="development">
<!-- 使用jdbc事务管理-->
<transactionManager type="JDBC" />
<!-- 数据库连接池-->
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!--8、配置SQL映射文件的位置-->
<mappers>
<mapper resource="sqlmap/UserMapper.xml"/>
<mapper resource="sqlmap/StudentMapper.xml"/>
<mapper resource="sqlmap/BasketballPlayerMapper.xml"/>
<mapper resource="sqlmap/FinacialMapper.xml"/>
<mapper resource="sqlmap/NewsLabelMapper.xml" />
<mapper resource="sqlmap/LazyLoadingMapper.xml" />
<mapper resource="sqlmap/BookMapper.xml" />
<mapper resource="sqlmap/GoodsMapper.xml" />
</mappers>
</configuration>
1.2 properties配置分析
在SqlMapConfig配置文件中,properties标签中的数据可以供整个配置文件中的其他配置使用。properties标签可以引入一个可动态变换的外部配置,如一个传统的Java配置文件,亦或是一个properties参数配置文件。当然,在properties标签内部也可以放置property标签,来配置子元素信息。对于配置文件中的其他配置,可以通过property子标签的name属性来取得相应的value值。
一个properties标签配置样例如下(引入了一个jdbc.properties文件)
<!-- 注册DB连接四要素的属性文件 -->
<properties resource="jdbc.properties">
<property name="username" value="root" />
<property name="password" value="root" />
</properties>
可以看到,其中引入了一个jdbc.properties属性文件,该配置文件样例如下:
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8
jdbc.username=root
jdbc.password=root
jdbc.properties配置文件中配置了数据库的详细连接信息,properties标签这样引入它避免了数据库信息的“硬编码”。当需要连接其他数据库时,只需要更改要连接的数据库的配置文件路径即可。
当然properties标签也可以包含property子标签,该子标签中的值也可以被配置文件中的其他配置使用,属于一种全局参数。可以看到,这里虽引入了jdbc.properties文件,但是其中的username和password还可以重新在property子标签中配置,这个时候取的就是property子标签中的value值。这样配置是因为有时候有些模块的数据库连接的用户可能需要以不同的角色登录,这样可以在property子标签中动态分配数据库连接的用户名username和密码password。
在properties标签中引入的配置文件信息以及property子标签中配置的信息,在其他标签中可以使用“$ {}”占位符的方式来获取,在“$ {}”中填写引入的配置文件中参数的name或者property子标签的name,样例配置中的数据源信息配置其实就是获取properties标签中的配置信息。
<!-- 数据库连接池-->
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
另外,在MyBatis 3.4.2之后,还可以在“$ {}”占位符中设置一个默认值。当然,首先要在properties标签中设置一个启用占位符默认值的配置,该配置如下:
<!-- 注册DB连接四要素的属性文件 -->
<properties resource="jdbc.properties">
<property name="org.apache.ibatis.parsing.PropertyParser.enable-defaut-value" value="true" />
</properties>
然后在其他属性引用properties标签中的参数时,可以这样设置一个默认值
<!-- 数据库连接池-->
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username:root}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
即在所需引入的属性名的后面添加“:”引号,然后紧跟着填写当jdbc.username不存在或为空时的默认值。
1.3 setting配置分析
setting配置也是MyBatis全局配置文件中比较重要的配置,它影响MyBatis框架在运行时的一些行为。setting配置缓存、延迟加载、结果集控制、执行器、分页设置、命名规则等一系列控制性参数,与MyBatis的运行性能息息相关。所有的setting配置都被包裹在settings标签对中,setting可配置的参数如下表所示。
属性名 | 含义 | 简介 | 有效值 | 默认值 |
---|---|---|---|---|
cacheEnabled | 是否使用缓存 | 是整个工程中所有映射器配置缓存的开关,即是一个全局缓存开关 | true/false | true |
lazyLoadingEnabled | 是否开启延迟加载 | 控制全局是否使用延迟加载。当有特殊关联关系需要单独配置时,可以使用fetchType属性来覆盖此配置 | true/false | false |
aggressiveLazyLoading | 是否需要侵入式延迟加载 | 开启时,无论调用什么方法加载某个对象,都会加载该对象的所有属性,关系之后只会按需加载 | true/false | false |
multipleResultSetsEnabled | 是否允许单一语句返回多结果集 | 即Mapper配置中一个单一的SQL配置是否能返回多个结果集 | true/false | true |
useColumnLabel | 使用列标签代替列名 | 设置是否使用列标签代替列名 | true/false | true |
useGeneratedKeys | 是否支持JDBC自动生成主键 | 设置之后,将会强制使用自动生成主键的策略 | true/false | false |
autoMappingBehavior | 指定MyBatis自动映射字段或属性的方式 | 有三种方式,NONE时将取消自动映射;PARTIAL时只会自动映射没有定义结果集的结果映射;FULL时会映射任意复杂的结果集 | NONE/PARTIAL/FULL | PARTIAL |
autoMappingUnknownColumnBehavior | 设置当自动映射时发现未知列的动作 | 有三种动作:NONE时不做任何操作;WARNING时会输出提醒日志;FAILING时会抛出SqlSessionException异常表示映射失败 | NONE/WARNING/FAILING | NONE |
defaultExecutorType | 设置默认的执行器 | 有三种执行器:SIMPLE为普通执行器;REUSE执行器会重用与处理语句;BATCH执行器将重用语句并执行批量更新 | SIMPLE/REUSE/BATCH | SIMPLE |
defaultStatementTimeout | 设置超时时间 | 该超时时间即数据库驱动连接数据库时,等待数据库回应的最大秒数 | 任意正整数 | 无 |
defaultFetchSize | 设置驱动的结果集获取数量(fetchSize)的提示值 | 为了防止从数据库查询出来的结果过多,而导致内存溢出,可以通过设置fetchSize参数来控制结果集的数量 | 任意正整数 | 无 |
safeRowBoundsEnabled | 允许在嵌套语句中使用分页(RowBound,即行内嵌套语句) | 如果允许在SQL的行内嵌套语句中使用分页,就设置该值为false | true/false | false |
safeResultHandlerEnabled | 允许在嵌套语句中使用分页(ResultHandler,即结果集处理) | 如果允许在SQL的结果集使用分页,就设置该值为false | true/false | true |
mapUnderscoreToCamelCase | 是否开启驼峰命名规则(camel case)映射 | 表明数据库中的字段名称与工程中Java实体类的映射是否采用驼峰命名规则校验 | true/false | false |
localCacheScope | MyBatis利用本地缓存机制(Local Cache)防止循环引用(circular references)和加速重复嵌套查询 | 默认值为SESSION,这种情况下会缓存一个会话中执行的所有查询。若设置值为STATEMENT,本地会话仅用在语句执行上,对相同SqlSession的不同调用将不会共享数据 | SESSION/STATEMENT | SESSION |
jdbcTypeForNull | JDBC类型的默认设置 | 当没有为参数提供特定的JDBC类型时,为空值指定JDBC类型。某些驱动需要指定列的JDBC类型,多数情况直接用一般类型即可,比如NULL、VARCHAR或OTHER | 常用NULL、VARCHAR、OTHER | OTHER |
lazyLoadTriggerMethods | 指定哪个对象的方法触发一次延迟加载 | 配置需要触发延迟加载的方法的名字,该方法就会触发一次延迟加载 | 一个逗号分隔的方法名称列表 | equals,clone,hashCode,toString |
defaultScriptingLanguage | 动态SQL默认语言 | 指定动态SQL生成的默认语言 | 一个类型别名或者一个类的全路径名 | org.apache.ibatis.scripting.xmltags.XMLLanguageDriver |
callSettersOnNulls | 是否在控制情况下调用Set方法 | 指定当结果集中值为null时是否调用映射对象的setter(map对象时为put)方法,这对于有Map.keySet()依赖或null值初始化时是有用的。注意基本类型是不能设置成null的 | true/false | false |
returnInstanceForEmptyRow | 返回空实体集对象 | 当返回行的所有列都是空时,MyBatis默认返回null。当开启这个设置时,MyBatis会返回一个空实例。请注意,它也适用于嵌套的结果集(从MyBatis3.4.2版本开始) | true/false | false |
logPrefix | 日志前缀 | 指定MyBatis所用日志的具体实现,未指定时将自动查找 | 任意字符串 | 无 |
logImpl | 日志实现 | 指定MyBatis所用日志的具体实现,未指定时将自动查找 | SLF4J、LOG4J、LOG4J2、JDK_LOGGING、COMMONS_LOGGING、STDOUT_LOGGING、NO_LOGGING | 无 |
proxyFactory | 代理工厂 | 指定MyBatis创建具有延迟加载能力的对象所用到的代理工具 | CGLIB、JAVASSIST | JAVASSIST |
vfsImpl | vfs实现 | 指定vfs的实现 | 自定义VFS的实现的类的全限定名,以逗号分隔 | 无 |
useActualParamName | 使用方法签名 | 允许使用方法签名中的名称作为语句参数名称。要使用该特性,工程必须采用Java8编译,并且加上-parameters选项(从MyBatis3.4.1版本开始) | 自定义VFS的实现的类的全限定名,以逗号分隔 | 无 |
configurationFactory | 配置工厂 | 指定提供配置示例的类。返回的配置实例用于加载反序列化的懒加载参数。这个类必须有一个签名的静态配置getconfiguration()方法(从MyBatis3.2.3版本开始) | 一个类型别名或者一个类型的全路径名 | 无 |
一个完整的settings配置元素样例如下:
<settings>
<setting name="cahceEnabled" value="true" />
<setting name="lazyLoadingEnabled" value="true" />
<setting name="multipleResultSetsEnabled" value="true" />
<setting name="useColumnLabel" value="true" />
<setting name="useGeneratedKeys" value="false" />
<setting name="autoMappingBehavior" value="PARTIAL" />
<setting name="autoMappingUnknownColumnBehavior" value="WARNING" />
<setting name="defaultExecutorType" value="SIMPLE" />
<setting name="defaultStatementTimeout" value="25" />
<setting name="defaultFetchSize" value="100" />
<setting name="safeRowBoundsEnabled" value="false" />
<setting name="mapUnderscoreToCamelCase" value="false" />
<setting name="localCacheScope" value="SESSION" />
<setting name="jdbcTypeForNull" value="OTHER" />
<</