注:博文针对的是MyBatis 3.4.0-SNAPSHOT版本
此篇博文主要参考MyBatis的官方文档。如果需要详细指导,请移步MyBatis官方指南。
属性-properties
properties里设置的属性,可以在外部properties文件、properties属性以及函数参数中配置。譬如:
<properties resource="path/to/properties">
<property name="username" value="test"></property>
<property name="password" value="test"></property>
</properties>
当在配置数据源的时候,可以这样的引用:
<?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>
<properties resource="path/to/properties">
<property name="name" value="test"></property>
<property name="pass" value="test"></property>
</properties>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="${driver}"></property>
<property name="url" value="${url}"></property>
<property name="username" value="${name}"></property>
<property name="password" value="${pass}"></property>
</dataSource>
</environment>
</environments>
</configuration>
另外,属性还可以通过函数参数来直接获取。譬如:
SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader, props);
// ... or ...
SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader, environment, props);
其中,dataSource中的driver、url属性来自于configuration中配置的properties文件中,而username,password则来自于properties属性中。
注:由于xml中的属性获取值有多个来源,所以必须明确获取来源的顺序。其顺序为:
1、从configuration中配置的properties的子元素中获取;
2、从configuration中resource配置的配置文件中获取;
3、从确定此属性的函数参数中获取
从1->2->3,如果有重名的属性,则后面会覆盖前面的值。
设置-setting
以下属性都是MyBatis中重要的属性,调整这些属性可以改变MyBatis的运行时行为。请见下表:
设置参数 | 描述 | 有效值 | 默认值 |
---|---|---|---|
cacheEnabled | 该配置影响到所有映射器的缓存开关 | true/false | false |
lazyLoadingEnabled | 延迟加载的全局开发。刚开启时,所有的关联对象都会延迟加载。特定关联关系中可通过设置fetch 属性来覆盖该项的开发。 | true/false | false |
aggressiveLazyLoading | 当启用时,对任意延迟属性的调用会使具有延迟加载属性的对象完整加载;反之,每种属性将会按需加载 | true/false | true |
multipleResultSetsEnabled | 是否允许单一语句返回多结果集(需要驱动的兼容) | true/false | true |
useColumnLabel | 使用列标签代替列名。不同的驱动会有不同的表现,具体可参考相关驱动文档或通过测试这两种不同的模式来观察所用驱动的结果 | true/false | true |
useGeneratedKeys | 允许JDBC支持自动生成主键,需要驱动兼容。当设置为true时,则强制使用主键,尽管一些驱动不能兼容但仍可正常工作 | true/false | false |
autoMappingBehavior | 指定MyBatis应该如何映射列到字段或者属性。NONE表示取消自动映射;PARTIAL只会映射没有定义嵌套的结果集映射的结果集;FULL会自动映射任何复杂的结果集 | NONE/PARTIAL/FULL | PARTIAL |
defaultExecutorType | 配置默认的执行器。SIMPLE表示普通的执行器;REUSE执行器会重用预处理语句;BATCH执行器将重用语句并执行批量更新 | SIMPLE/REUSE/BATCH | SIMPLE |
defaultStatementTimeout | 设置驱动等待数据库的超时时间(秒) | 任何正值 | 没有设置 |
defaultFetchSize | 设置查询一次所返回的结果集大小。这个参数可以被查询设置重新覆盖 | 任何正值 | 没有设置 |
safeRowBoundsEnabled | 允许在嵌套语句中使用分页 | true/false | false |
mapUnderscoreToCamelCase | 是否开启自动驼峰命名规则映射,即从数据库列名A_COLUMN映射为aColumn的类似映射 | true/false | false |
localCacheScope | MyBatis利用本地缓存机制防止循环引用和加速重复嵌套查询。默认为SESSION,表示会缓存一个会话中执行的所有查询。若设置为STATEMENT,则仅用于语句执行上,对相同的SqlSession的不同调用将不会共享数据 | SESSION/STATEMENT | SESSION |
jdbcTypeForNull | 当没有为参数提供特定的JDBC类型时,为空值指定JDBC类型。某些驱动需要指定列的JDBC类型,多数情况直接用一般类型即可,如:NULL,VARCHAR或OTHER。 | JdbcType/NULL/VARCHAR/OTHER | OTHER |
lazyLoadTriggerMethods | 指定哪个对象的方法触发一次延迟加载 | 通过逗号隔开的一系列方法名 | equals,clone,hashCode,toString |
defaultScriptingLanguage | 指定动态SQL生成的默认语言 | 别名或者类全名 | org.apache.ibatis.scripting.xmltags.XMLDynamicLanguageDriver |
callSetterOnNulls | 指定当结果集中值为NULL的时候是否调用映射对象的setter(map调用put)方法|true/false | false | |
logPrefix | 指定MyBatis增加到日志名称的前缀 | 任何字符串 | 没有设置 |
logImpl | 指定MyBatis所用日志的具体实现,未指定时将自动查找 | SLF4J/LOG4J/LOG4J2/JDK_LOGGING/COMMONS_LOGGING/STDOUT_LOGGING/NO_LOGGING | 没有设置 |
proxyFactory | 指定MyBatis创建具有延迟加载能力的对象所用到的代理工具 | CGLIB/JAVASSIST | JAVASSIST |
vfxImpl | 特殊的VFS的实现 | 通过逗号分割开,自定义实现的VFS的全类名 | 没有设置 |
一个配置完整的settings元素的实例如下:
<settings>
<setting name="cacheEnabled" 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="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"/>
<setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>
</settings>
类型别名-typeAliases
类型别名是为Java类型设置一个短的名字。使用方法为:
1、直接在XML文件中某个类设置别名。如:
<typeAliases>
<typeAlias alias="Author" type="domain.blog.Author"></typeAlias>
<typeAlias alias="Blog" type="domain.blog.Blog"></typeAlias>
</typeAliases>
当这样配置的时候,Author、Blog就可以代替任何出现domain.blog.Author、domain.blog.Blog的地方。
2、为typeAliases下指定一个包名,这样,此包下面的所有POJO类型都会以首字母小写的非限定类名作为它的别名。如:
<typeAliases>
<package name="domain.blog"></package>
</typeAliases>
当这样配置的时候,domain.blog包下的POJO(如:domain.blog.Author)将以首字母小写的非限定类名作为它的别名(author)。
3、注解。
@Alias("author")
public class Author {
...
}
当这样配置的时候,Author类型的别名将会为author。
另外,MyBatis已经为我们提供了许多内建的类型别名。他们都是大小写不敏感的,需要注意基本类型重名导致的特殊处理。
别名 | 映射的类型 |
---|---|
_byte | byte |
_long | long |
_short | short |
_int | int |
_integer | int |
_double | double |
_float | float |
_boolean | boolean |
string | String |
byte | Byte |
long | Long |
short | Short |
int | Integer |
integer | Integer |
double | Double |
float | Float |
boolean | Boolean |
date | Date |
decimal | BigDecimal |
bigdecimal | BigDecimal |
object | Object |
map | Map |
hashmap | HashMap |
list | List |
arraylist | ArrayList |
collection | Collection |
iterator | Iterator |
配置环境(environments)
环境变量(environment)
MyBatis可以配置成适应多种环境,这种机制有助于将SQL映射应用于多种数据库之中。但是,尽管MyBatis可以配置成适应多种环境,每个SqlSessionFactory实例只能对应一个环境。
- 每个数据库对应一个SqlSessionFactory实例
为了指定创建哪种环境,只要将它作为可选的参数传递给SqlSessionFactoryBuilder即可。如:
SqlSessionFactory factory = SqlSessionFactoryBuilder.build(reader, environment);
SqlSessionFactory factory = SqlSessionFactoryBuilder.build(reader, environment, properties);
如果,忽略environment参数,则默认环境将会被加载。
另外,环境元素定义了如何配置环境。如我上面的一个实例:
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="${driver}"></property>
<property name="url" value="${url}"></property>
<property name="username" value="${name}"></property>
<property name="password" value="${pass}"></property>
</dataSource>
</environment>
</environments>
注意关键点:
- 默认的环境ID,譬如这里的default=”development”
- 每个environment元素定义的环境ID,譬如这里的id=”development”
- 事务管理器的配置,譬如这里的type=”JDBC”
- 数据源的配置,譬如这里的type=”POOLED”
接下来就着重看看事务管理器和数据源。
事务管理器(transactionManager)
在MyBatis中有两种类型的事务管理器,一为JDBC、一为MANAGED。
JDBC
MyBatis直接使用JDBC的提交 回滚设置,依赖于从数据源得到的连接来管理事务范围。MANAGED
这个配置几乎没做什么。从来不提交或回滚一个连接,而是让容器来管理事务的整个生命周期。默认情况下它会关闭连接,然而一些容器并不希望这样,因此需要将closeConnection属性设置为false来阻止它默认的关闭行为。譬如:
<transactionManager type="MANAGED">
<property name="closeConnection" value="false"></property>
</transactionManager>
数据源(dataSource)
MyBatis内建的数据源类型有三种,分别为UNPOOLED,POOLED,JNDI。
1、UNPOOLED
采用这种数据源的连接,数据库会为每次查询新建查询连接。这种方式仅适用于不要求性能的简单应用程序。一般不怎么使用。UNPOOLED类型的数据源仅仅需要配置以下5种属性:
- driver JDBC驱动的Java类的完全限定名
- url 数据库的JDBC URL地址
- username 登录数据库的用户名
- password 登录数据库的密码
- defaultTransactionIsolationLevel 默认的连接事务隔离级别
作为可选项,也可以传递属性给数据库驱动程序。只需要在属性的前面加上”driver.”即可。譬如: - driver.encoding = UTF8
这将通过DriverManager.getConnection(url, driverProperties)方法传递值为UTF8的encoding属性给数据库驱动。
2、POOLED
采用这种数据源的配置,数据库将会创建一个数据库连接池,避免为每次到来的操作创建连接耗费时间。这是当前一种流行的方式。
POOLED的属性,除了上面UNPOOLED的5个属性外,还有以下属性:
- poolMaximumActiveConnection 在任意时间可以存在的活动(正在使用)连接数量,默认值为10
- poolMaximumIdleConnection 任意时间可能存在的空闲连接数
- poolMaximumCheckoutTime 在被强制返回之前,池中连接被检出时间,默认值为20000毫秒
- poolTimeWait 当连接没有建立,转而去获取下一次新连接时的等待时间
- poolPingQuery 发送到数据库的侦测查询,用来检验连接是否处在正常工作秩序中并准备接受请求。默认是”NO PING QUERY SET”,这会导致多数数据库驱动失败时带有一个恰当的错误消息
- poolPingEnabled 是否启用侦测查询。若开启,则必须使用一个可执行的SQL语句设置poolPingQuery属性。默认为false。
- poolPingConnectionsNotUsedFor 配置poolPingQuery的使用频度。这可以适配成匹配具体的数据库连接超时时间来避免不必要的侦测。默认值为0。
3、JNDI
采用这种配置是为了在EJB或者应用服务器这类容器中使用,容器可以集中或在外部配置数据源,然后放置一个JNDI上下文的引用。这种数据源配置只需两个属性:
- initial_context 这个属性用来在InitialContext中寻找上下文。这是个可选属性。如果忽略,那么data_source属性将会直接从InitialContext中寻找。
- data_source 这是引用数据源实例位置的上下文的路径。提供了initial_context配置时会在其返回的上下文中进行查询,没有提供则直接在InitialContext 上查找。
和其他数据源配置类似,可以通过添加前缀”env.”直接把属性传递给初始上下文。譬如: - env.encoding = UTF8
注:当你采用Spring+MyBatis集成框架时,事务管理器以及数据源则常常采用Spring模块来配置。
映射器 (mappers)
这些配置告诉MyBatis去哪里找到映射文件,也是MyBatis的核心。可以采用类路径的资源引用或限定资源定位符,或包名、类名等。
1、类路径的资源引用
<mappers>
<mapper resource="org/mybatis/builder/AuthorMapper.xml"></mapper>
<mapper resource="org/mybatis/builder/BlogMapper.xml"></mapper>
<mapper resource="org/mybatis/builder/PostMapper.xml"></mapper>
</mappers>
2、全限定路径
<mappers>
<mapper url="file:///var/mappers/AuthorMapper.xml"></mapper>
<mapper url="file:///var/mappers/BlogMapper.xml"></mapper>
<mapper url="file:///var/mappers/PostMapper.xml"></mapper>
</mappers>
3、接口类名
<mappers>
<mapper class="org.mybatis.builder.AuthorMapper"></mapper>
<mapper class="org.mybatis.builder.BlogMapper"></mapper>
<mapper class="org.mybatis.builder.PostMapper"></mapper>
</mappers>
4、包名
<mappers>
<package name="org.mybatis.builder"></package>
</mappers>