前言:在mybatis的简单入门后,我们已经对mybatis有了一个大致的认识(可参照博主之前的博文)。为了更深入地了解mybatis,我们接下来学习mybatis的XML映射配置文件。
MyBatis 的配置文件包含了影响 MyBatis 行为甚深的设置(settings)和属性(properties)信息。本文的顶层结构如下:
configuration 配置
properties 属性
settings 设置
typeAliases 类型命名
typeHandlers 类型处理器
objectFactory 对象工厂
plugins 插件
environments 环境
environment 环境变量
transactionManager 事务管理器
dataSource 数据源
databaseIdProvider 数据库厂商标识
mappers 映射器
接下来博主会尽量简单地介绍自己用过的属性。
properties
常用程度:***(几乎都要用)
作用:用properties文件中设置好的值替换配置文件的属性值,减少硬编码。例:
resource="jdbc.properties"/>default="development">id="development">type="JDBC"/>type="POOLED">name="driver"value="${jdbc.driver}"/>name="url"value="${jdbc.url}"/>name="username"value="${jdbc.username}"/>name="password"value="${jdbc.password}"/>
加上
jdbc.driver=com.mysql.jdbc.Driverjdbc.url=jdbc:mysql://localhost:3306/mybatisjdbc.username=rootjdbc.password=123
等同于
default="development">id="development">type="JDBC"/>type="POOLED">name="driver"value="com.mysql.jdbc.Driver"/>name="url"value="jdbc:mysql://localhost:3306/mybatis"/>name="username"value="root"/>name="password"value="123"/>
settings常用程度:**(较经常用,大部分属性可使用默认值)
作用:调整 settings 中的设置是非常关键的,它们会改变 MyBatis 的运行时行为。
下表描述了设置中各项的意图、默认值等。
设置参数
描述
有效值
默认值
cacheEnabled
该配置影响的所有映射器中配置的缓存的全局开关。
true | false
true
lazyLoadingEnabled
延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。特定关联关系中可通过设置fetchType属性来覆盖该项的开关状态。
true | false
false
aggressiveLazyLoading
当启用时,带有延迟加载属性的对象的加载与否完全取决于对任意延迟属性的调用;反之,每种属性将会按需加载。
true | false
true
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 执行器会重用预处理语句(prepared statements);BATCH 执行器将重用语句并执行批量更新。
SIMPLE REUSE BATCH
SIMPLE
defaultStatementTimeout
设置超时时间,它决定驱动等待数据库响应的秒数。
Any positive integer
Not Set (null)
safeRowBoundsEnabled
允许在嵌套语句中使用行分界(RowBounds)。
true | false
False
mapUnderscoreToCamelCase
是否开启自动驼峰命名规则(camel case)映射,即从经典数据库列名 A_COLUMN 到经典 Java 属性名 aColumn 的类似映射。
true | false
False
localCacheScope
MyBatis 利用本地缓存机制(Local Cache)防止循环引用(circular references)和加速重复嵌套查询。默认值为 SESSION,这种情况下会缓存一个会话中执行的所有查询。若设置值为 STATEMENT,本地会话仅用在语句执行上,对相同 SqlSession 的不同调用将不会共享数据。
SESSION | STATEMENT
SESSION
jdbcTypeForNull
当没有为参数提供特定的 JDBC 类型时,为空值指定 JDBC 类型。某些驱动需要指定列的 JDBC 类型,多数情况直接用一般类型即可,比如 NULL、VARCHAR 或 OTHER。
JdbcType enumeration. Most common are: NULL, VARCHAR and OTHER
OTHER
lazyLoadTriggerMethods
指定哪个对象的方法触发一次延迟加载。
A method name list separated by commas
equals,clone,hashCode,toString
defaultScriptingLanguage
指定动态 SQL 生成的默认语言。
A type alias or fully qualified class name.
org.apache.ibatis.scripting.xmltags.XMLDynamicLanguageDriver
callSettersOnNulls
指定当结果集中值为 null 的时候是否调用映射对象的 setter(map 对象时为 put)方法,这对于有 Map.keySet() 依赖或 null 值初始化的时候是有用的。注意原始类型(int、boolean等)是不能设置成 null 的。
true | false
false
logPrefix
指定 MyBatis 增加到日志名称的前缀。
Any String
Not set
logImpl
指定 MyBatis 所用日志的具体实现,未指定时将自动查找。
SLF4J | LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING
Not set
proxyFactory
为 Mybatis 用来创建具有延迟加载能力的对象设置代理工具。
CGLIB | JAVASSIST
CGLIB
实际情况是不一定用到全部设置,有需要再翻文档。
typeAliases
常用程度:***(很多情况下都会使用)
作用:只和 XML 配置有关,为java类起别名,存在的意义仅在于用来减少类完全限定名的冗余。
mybatis-config.xml中
type="pojo.Person"alias="Person"/>
加上
Person.xml中
id="insertPerson"parameterType="Person">INSERT INTO PERSON(ID,USERNAME,AGE,MOBILEPHONE)VALUES (#{id},#{userName},#{age},#{mobilePhone})
等同于
Person.xml中
id="insertPerson"parameterType="pojo.Person">INSERT INTO PERSON(ID,USERNAME,AGE,MOBILEPHONE)VALUES (#{id},#{userName},#{age},#{mobilePhone})
配置环境(environments)
常用程度:***(几乎都要用且很重要)
作用:配置环境,创建SqlSessionFactory。
结构:
事务管理器(transactionManager)
在 MyBatis 中有两种类型的事务管理器(也就是 type=”[JDBC|MANAGED]”):
JDBC – 这个配置就是直接使用了 JDBC 的提交和回滚设置,它依赖于从数据源得到的连接来管理事务范围(常用)。
MANAGED – 这个配置几乎没做什么。它从来不提交或回滚一个连接,而是让容器来管理事务的整个生命周期(比如 JEE 应用服务器的上下文)。默认情况下它会关闭连接,然而一些容器并不希望这样,因此需要将 closeConnection 属性设置为 false 来阻止它默认的关闭行为。例如:
ps:如果你正在使用 Spring + MyBatis,则没有必要配置事务管理器,因为 Spring 模块会使用自带的管理器来覆盖前面的配置。
数据源(dataSource)
dataSource 元素使用基本的 JDBC 数据源接口来配置 JDBC 连接对象的资源。
有三种内建的数据源类型(也就是 type=”???”):
无连接池(UNPOOLED):
没有连接池,每次请求数据库都要打开和关闭连接。性能较差,适用于简单程序。
UNPOOLED 类型的数据源仅仅需要配置以下 5 种属性:
driver – 这是 JDBC 驱动的 Java 类的完全限定名(如果你的驱动包含,它也不是数据源类)。
url – 这是数据库的 JDBC URL 地址。
username – 登录数据库的用户名。
password – 登录数据库的密码。
defaultTransactionIsolationLevel – 默认的连接事务隔离级别。
作为可选项,你也可以传递 properties 给数据库驱动。要这样做,属性的前缀以“driver.”开头,例如:
driver.encoding=UTF8
这样就会传递以值 “UTF8” 来传递属性“encoding”,它是通过DriverManager.getConnection(url,driverProperties)方法传递给数据库驱动的。
有连接池(POOLED):创建了数据库连接池,池中有一定的连接数,省去了每次请求数据库时打开和关闭连接的操作。性能较好,是一种使得并发 Web 应用快速响应请求的流行处理方式。
除了上述无连接池(UNPOOLED)的属性外,会有更多属性用来配置有连接池(POOLED)的数据源:
poolMaximumActiveConnections – 在任意时间可以存在的活动(也就是正在使用)连接数量,默认值:10
poolMaximumIdleConnections – 任意时间可能存在的空闲连接数。
poolMaximumCheckoutTime – 在被强制返回之前,池中连接被检出(checked out)时间,默认值:20000 毫秒(即 20 秒)
poolTimeToWait – 这是一个低层设置,如果获取连接花费的相当长的时间,它会给连接池打印日志并重新尝试获取一个连接的机会(避免在误配置的情况下一直安静的失败),默认值:20000 毫秒(即 20 秒)。
poolPingQuery – 发送到数据的侦测查询,用来检验连接是否处在正常工作秩序中并准备接受请求。默认是“NO PING QUERY SET”,这会导致多数数据库驱动失败时带有一个恰当的错误消息。
poolPingEnabled – 是否启用侦测查询。若开启,也必须使用一个可执行的 SQL 语句设置 poolPingQuery 属性(最好是一个非常快的 SQL),默认值:false。
poolPingConnectionsNotUsedFor – 配置 poolPingQuery 的使用频度。这可以被设置成匹配标准的数据库连接超时时间,来避免不必要的侦测,默认值:0(即所有连接每一时刻都被侦测 — 当然仅当 poolPingEnabled 为 true 时适用)。
JNDI:这个数据源的实现是为了能在如 EJB 或应用服务器这类容器中使用,容器可以集中或在外部配置数据源,然后放置一个 JNDI 上下文的引用(不常用,故不作详细说明,详细看官方文档)。
映射器(mappers)常用程度:***(几乎都要用)
用处:告诉 MyBatis 到哪里去找到SQL 映射语句。
使用方式:1、相对于类路径的资源引用;2、完全限定资源定位符(包括 file:/// 的 URL);3、类名和包名等。例如:
除了上面介绍到的属性外,还有typeHandlers、objectFactory、plugins、databaseIdProvider属性,但因为博主尚未接触到,故暂不作详细的介绍,留待日后补充吧~
另外,xml配置文件的内容必须按照顺序:
properties
settings
typeAliases
typeHandlers
objectFactory
objectWrapperFactory
plugins
environments
databaseIdProvider
mappers
否则报以下错误:
org.apache.ibatis.builder.BuilderException: Error creating document instance.
附上本文官方文档链接:http://www.mybatis.org/mybatis-3/zh/configuration.html#
若有错漏,欢迎指出~