11.2【MyBatis】主配置文件
MyBatis的 XML 配置文件包含了影响 MyBatis 行为很深的设置和属性信息,也可称之为主配置文件。此 XML文档的层级结构如下:
configuration一>配置
properties一>属性
settings一>设置
typeAliases一>类型命名
typeHandlers一>类型处理器
objectFactory一>对象工厂
plugins一>插件
environments一>配置环境
environment一>环境变量
transactionManager一>事务管理器
dataSource一>数据源
databaseIdProvider一>数据库厂商标识
mappers一>映射器
必须注意的是,MyBatis 配置项的顺序不能颠倒。如果其顺序颠倒了,则会在 MyBatis 启动阶段发生异常,导致程序无法运行。例如,可能会产生如下的报错信息:
org.xml.sax.SaxParseException: The content of elment type "configuration must match" "(properties?,setting?,typeAliases?,..., environments?databaseIdProvider?,mappers?)"
1.properties(属性)
MyBatis 提供了 3 种方式来使用 properties,分别如下
(1)property子元素。
(2)properties 文件。
(3)程序代码传递。
properties 属性可以通过property 子元素来传递也可以配置在典型的Java属性配置文件中。例如:
<properties resource="org/mybatis/example/jdbc.properties"> <property name="username" value="boy" /> <property name="password" value="1" /> </properties>
其中的属性可以在整个配置文件中使用,使用可替换的属性(参数)来实现动态配置。
例如:
<dataSource type="POOLED"> <property name="driver" value="${driver}"/> <property name="url" value="${url}"/> <property name="username" value="${username}" /> <property name="password" value="${password}" /> </dataSource>
其中,username 和 password 将会由 property 子元素中设置的值来替换。driver 和 url 属性将会由包含进来的jdbc.properties文件中的值来替换。
属性也可以被传递到SqlSessionBuilder.build()方法中。例如:
SqlSessionFactory factory=sqlSessionFactoryBuilder.build(reader, props); //...or... SqlSessionFactory factory = qlSessionFactoryBuilder,build(reader,environmentprops);
如果属性多于一个,则MyBatis将按照如下的顺序进行属性加载。
1)在 properties 元素体内指定的属性被读取。
2)从类路径下资源或者 properties 元素的 url 属性中加载的属性被读取它会覆盖已经存在的完全一样的属性。
3)作为方法参数传递的属性最后被读取,它也会覆盖任一已经存在的完全一样的属性这些属性可能是从 properties 元素体内和资源或者 url 属性中加载的。
因此,最高优先级的属性是那些作为方法参数的属性,其次是资源 /url 属性,最后是 properties 元素中指定的属性。
2.settings(设置)
settings 会改变 MyBatis 在运行时的行为方式是 MyBatis 中极为重要的调整设置。表11-1描述了 MyBatis 的设置信息,以及其含义和默认值。
设置参数 |
描述 |
有效值 |
默认值 |
cacheEnabled |
该配置影响所有映射器中配置缓存的全局开关 |
true|false |
true |
lazyLoadingEnabled |
延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。特定关联关系中可通过设置 fetchType 属性来覆盖该项的开关状态 |
true|false |
false |
aggressiveLazyLoading |
是否允许单一语句返回多结果集(需要兼容驱动) |
true|false |
false(版本3.4.1以后) |
multipleResultSetsEnabled |
是否允许单一语句返回多结果集(需要兼容驱动) |
true|false |
true |
useColumnLabel |
使用列标签代替列名。不同的驱动在这方面会有不同的表现,具体可参考相关驱动文档或通过测试这两种不同的模式来观察所用驱动的结果 |
true|false |
true |
useGeneratedKeys |
允许JDBC支持自动生成主键,需要驱动兼容。如果设置为 true,则这个设置强制使用自动生成主键,尽管一些驱动不能兼容但仍可正常工作(如Derby) |
true|false |
false |
autoMappingBehavior |
指定 MyBatis 应如何自动映射到字段或属性。NONE 表示取消自动映射;PARTIAL表示只会自动映射,没有定义套结果集和映射结果集;FULL 会自动映射任意复杂的结果集(无论是否套) |
NONE、PARTIAL、FUll |
PARTIAL |
defaultExecutorType |
配置默认的执行器。SIMPLE 是普通的执行器;REUSE 会重用预处理语句;BATCH 执行器将重用语并执行批量更新 |
SIMPLE、REUSE、BATCH |
SIMPLE |
defaultStatementTimeout |
设置超时时间,它决定驱动等待数据库响应的秒数 |
任何正整数 |
Not Set (null) |
mapUnderscoreToCamelCase |
是否开启自动驼峰命名规则映射,即从经典数据库列名 ACOLUMN 到经典 Java 属性名 aColumn 的类似映射 |
true|false |
false |
localCacheScope |
MyBatis 利用本地缓存机制防止循环引用和加速重复查询默认值为SESSION,这种情况下会缓存一个会话中执行的所有查询。若设置值为STATEMENT,则本地会话仅用在语句执行上对相同 SqlSession 的不同调用将不会共享数据 |
SESSION|STATEMENT |
SESSION |
jdbcTypeForNull |
当没有为参数提供特定的 JDBC 类型时,为空值指定 JDBC 类型。某些驱动需要指定列的 JDBC 类型,多数情况直接用一般类型即可,如NULL、VARCHAR或OTHER |
NULL|VARCHAR|OTHER |
OTHER |
callSettersOnNulls |
指定当结果集中值为null的时候是否调用映射对象的settermap对象时为put)方法这对于有MapkeySet0依赖或nul值初始化的时候是有用的。注意,原始类型(int、boolean 等)是不能设置成null的 |
true|false |
false |
logPrefix |
指定 MyBatis 增加到日志名称的前缀 |
任何字符串 |
Not Set |
loglmpl |
指定MyBatis所用日志的具体实现,未指定时将自动查找 |
SLF4J|LOG4J等 |
Not Set |
proxyFactory |
指定Mybatis创建具有延迟加载能力的对象所用到的代理工具 |
CGLIBIJAVASSIST |
CGLIB |
3.typeAliases(别名)
类型别名是为 Java类型命名的一个短的名称。它只和XM配置有关,存在的意义仅在于用来减少类完全限定名的冗余。例如:
<typeAliases> <typeAliasalias="Blog” type="domain.blog.Blog"/></typeAliases> </typeAliases> <typeAliases> <package name="com.mialab.mybatisdemo.domainu/> </typeAliases>
这样,每一个包中的JavaBean在没有注解的情况下,会使用Bean的首字母小写的非限定类名来作为它的别名。
如果在包中的实体类中发现了 @Alias 注解,则将使用注解的值作为它的别名。例如,com.mialab.mybatis.demo.domain包下存在Student实体类,并且有以下代码。
那么,可用“student”来作为“com.mialab.mybatisdemo.domain.Student”的别名。
@Alias("student") public class Student { ... }
4.typeHandlers类型处理器
无论是MyBatis在预处理语句中设置一个参数,还是从结果集中取出一个值,类型处理器都被用来将获取的值以合适的方式转换成Java 类型。
5.objectFactory 对象工厂
MyBatis每次创建结果对象的新实例时,它都会使用一个对象工厂实例来完成。默认的对象工厂需要做的仅仅是实例化目标类,要么通过默认构造方法来实例化,要么在参数映射存在的时候通过参数构造方法来实例化。如果想覆盖对象工厂的默认行为,则可以通过创建自己的对象工厂来实现。
6.plugins(插件)
MyBatis允许用户在已映射语句执行过程中的某一点进行拦截调用默认情况下MBatis允许使用插件来拦截的接口和方法包括以下几个。
Executor (update,query,flushStatements,commit,rollback,getTransaction,closerisClosed) ParameterHandler (getParameterObject,setParameters) ResultSetHandler(handleResultSets,handleCursorResultSets, handleOutputResultSetHandlerParameters) StatementHandler (prepare,parameterizer batch, update, query)
这4个接口及其包含的方法的细节可以通过查看每个方法的签名来了解,或者直接查看MyBatis 发行包中的源代码。假设用户想做的不仅仅是监控方法的调用,那么应该很好地了解正在重写的方法的行为。因为在试图修改或重写已有方法行为的时候,很可能会破坏 MBatis的核心模块,这些都是底层的类和方法,所以使用插件的时候要特别当心。
7.environments (配置环境)
MyBatis可以配置多种环境,这种机制使得MyBatis可以将SOL映射应用于多种数据库中。例如,开发、测试和生产环境需要有不同的配置。尽管可以配置多个环境,但是每个SqlSessionFactory实例只能选择一个环境,即每个数据库对应一个SlSessionFactory实例。所以如果想连接两个数据库,就需要创建两个SqlSessionFactory实例,每个数据库对应一个。
8.mappers (映射器)
既然MyBatis的行为已经由上述元素配置现在需要开发者自己编写SQL映射语。mappers会告诉MyBatis到哪里去找映射文件,进而找到这些SOL语句。实际开发中,可以使用相对于类路径的资源引用或完全限定资源定位符(包括file:///URLs)类名或者包名等。例如:
<!-- Using classpath relative resources --> <mappers> <mapper resource-"org/mybatis/builder/AuthorMapper.xml"/> <mapper resource="org/mybatis/builder/BlogMapper.xml"/> </mappers> <!-- Using url fully qualified paths --> <mappers> <mapper url=file://va/mappers/AuthorMapper.xml"/> <mapper url=fl://var/mappers/BlogMapper.xm."/> </mappers> <!-- Using mapper interface classes --> <mappers> <mapper class="org.mybatis.builder.AuthorMapper"/> <mapper class="org.mybatis.builder.BlogMappr"/> </mappers> <!-- Register all interfaces in a package as mappers --> <mappers> <package name="org.mybatis.builder"/> </mappers>