本篇会摘录mybatis全局配置文件中比较常见经常使用的一些配置进行说明,其实
官方文档已经写得足够清晰了(关键是还有中文版彻底不慌),此处记录重要仍是做为我的的巩固记录。
一、properties
在全局配置文件中,属性的值是能够由外部配置进行动态替换的,这也就使咱们把诸如 “数据库链接信息放到单独的文件” 成为可能,这里有两种方式:
- 配置信息放在常见的 .properties 文件中,经过 resource 属性来引入
- 直接经过 property 属性进行定义
以下有 .properties 文件:
jdbc.username=root
jdbc.password=dev
则咱们在配置文件中配置数据库链接信息能够这样:
<configuration>
<properties resource="db.properties">
<property name="jdbc.driver" value="com.mysql.jdbc.Driver"/>
<property name="jdbc.url" value="jdbc:mysql://localhost:3306/dbgirl" />
</properties>
<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>
<mappers>
<mapper resource="sqlmapper/GirlMapper.xml"/>
</mappers>
</configuration>
属性值经过表达式
${ } 来读取,如上例中 driver 和 url 将从 properties 的元素 <property> 中读取,而 username 和 url 则能够从 db.properties 中读取。固然,更多状况下咱们仍是统一写在 .properties 中。须要注意的是,properties 元素体内的属性会优先读取,这意味着若是你在两个地方分别定义了同名的属性,那么最终读取到的值会以 .properties 文件中的为准。
二、environments
2.1 environment
如上例中咱们的数据库链接配置是放置在 <environments> 中的 <environment> 标签中,这是MyBatis提供的多环境适应机制,例如开发、测试、生产环境都须要有不一样的配置,这意味着假如你有生产环境和开发环境两种配置,你能够这样写:
<environments default="development">
<!--开发环境-->
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="root"/>
<property name="password" value="dev"/>
</dataSource>
</environment>
<!--生产环境-->
<environment id="produce">
<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>
- environment 的 id 属性用来区分和定义不一样的配置环境
- environments 的 default 用来肯定默认使用的配置环境,值是某个 environment 的 id
须要注意的是,
尽管能够配置多个环境,但每一个 SqlSessionFactory 实例只能选择其一,若是想链接两个数据库,就须要建立两个 SqlSessionFactory 实例,每一个数据库对应一个。
为了肯定建立哪一种环境,咱们每每须要将其做为参数传给 SqlSessionFactoryBuilder :
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, environment);
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, environment, properties);
若是忽略将 environment 做为参数传入,则会加载默认的环境:
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, properties);
2.2 transactionManager
在 MyBatis 中有两种类型的事务管理器:
- JDBC - 这个配置就是直接使用了 JDBC 的提交和回滚设置,它依赖于从数据源获得的链接来管理事务做用域
- MANAGED - 这个配置历来不提交或回滚一个链接,而是让容器来管理事务的整个生命周期
注:
若是你在使用 Spring + MyBatis,则没有必要配置事务管理器,由于 Spring 模块会使用自带的管理器来覆盖前面的配置
2.3 dataSource
dataSource 元素使用标准的 JDBC 数据源接口来配置 JDBC 链接对象的资源,有三种内建的数据源类型
- UNPOOLED - 只是每次被请求时打开和关闭链接
- POOLED - 利用“池”的概念将 JDBC 链接对象组织起来,避免了建立新的链接实例时所必需的初始化和认证时间
- JNDI - 为了能在如 EJB 或应用服务器这类容器中使用,容器能够集中或在外部配置数据源,而后放置一个 JNDI 上下文的引用
三、mappers
mappers是用来让告诉MyBatis去哪找到那些执行的SQL语句,可使用
相对于类路径的资源引用, 或
彻底限定资源定位符(包括 file:/// 的 URL),或
类名和
包名等:
<!-- 使用相对于类路径的资源引用 -->
<mappers>
<mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
<mapper resource="org/mybatis/builder/BlogMapper.xml"/>
<mapper resource="org/mybatis/builder/PostMapper.xml"/>
</mappers>
<!-- 使用彻底限定资源定位符(URL) -->
<mappers>
<mapper url="file:///var/mappers/AuthorMapper.xml"/>
<mapper url="file:///var/mappers/BlogMapper.xml"/>
<mapper url="file:///var/mappers/PostMapper.xml"/>
</mappers>
<!-- 使用映射器接口实现类的彻底限定类名 -->
<mappers>
<mapper class="org.mybatis.builder.AuthorMapper"/>
<mapper class="org.mybatis.builder.BlogMapper"/>
<mapper class="org.mybatis.builder.PostMapper"/>
</mappers>
<!-- 将包内的映射器接口实现所有注册为映射器 -->
<mappers>
<package name="org.mybatis.builder"/>
</mappers>
四、settings
在标题1-3中是MyBatis最最基本须要咱们改变的配置信息,而settings则是用来改变MyBatis运行时行为的重要调整设置,由于属性较多此处再也不细细展开,详见
官方文档,以下例为官方提供的部分示例,以在此处作简要说明:
<settings>
<!--全局地开启或关闭配置文件中的全部映射器已经配置的任何缓存-->
<setting name="cacheEnabled" value="true"/>
<!--延迟加载的全局开关。当开启时,全部关联对象都会延迟加载。特定关联关系中可经过设置fetchType属性来覆盖该项的开关状态-->
<setting name="lazyLoadingEnabled" value="true"/>
<!--是否容许单一语句返回多结果集(须要兼容驱动)-->
<setting name="multipleResultSetsEnabled" value="true"/>
<!--使用列标签代替列名,不一样的驱动在这方面会有不一样的表现-->
<setting name="useColumnLabel" value="true"/>
<!--容许 JDBC 支持自动生成主键,须要驱动兼容-->
<setting name="useGeneratedKeys" value="false"/>
<!--指定 MyBatis 应如何自动映射列到字段或属性-->
<setting name="autoMappingBehavior" value="PARTIAL"/>
<!--指定发现自动映射目标未知列(或者未知属性类型)的行为-->
<setting name="autoMappingUnknownColumnBehavior" value="WARNING"/>
<!--配置默认的执行器-->
<setting name="defaultExecutorType" value="SIMPLE"/>
<!--设置超时时间,它决定驱动等待数据库响应的秒数-->
<setting name="defaultStatementTimeout" value="25"/>
<!--为驱动的结果集获取数量(fetchSize)设置一个提示值。此参数只能够在查询设置中被覆盖-->
<setting name="defaultFetchSize" value="100"/>
<!--容许在嵌套语句中使用分页,若是容许使用则设置为false-->
<setting name="safeRowBoundsEnabled" value="false"/>
<!--是否开启自动驼峰命名规则映射,即从经典数据库列名A_COLUMN到经典Java属性名aColumn的相似映射-->
<setting name="mapUnderscoreToCamelCase" value="false"/>
<!--利用本地缓存机制防止循环引用和加速重复嵌套查询-->
<setting name="localCacheScope" value="SESSION"/>
<!--当没有为参数提供特定的JDBC类型时,为空值指定哪一种JDBC类型-->
<setting name="jdbcTypeForNull" value="OTHER"/>
<!--指定哪一个对象的方法触发一次延迟加载,用逗号分隔的方法列表-->
<setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>
</settings>
五、typeAliases
类型别名是为 Java 类型设置一个短的名字。它只和 XML 配置有关,存在的意义仅在于用来减小类彻底限定名的冗余,以下配置时 “Blog能够用在任何使用domain.blog.Blog的地方”:
<typeAliases>
<typeAlias alias="Author" type="domain.blog.Author"/>
<typeAlias alias="Blog" type="domain.blog.Blog"/>
<typeAlias alias="Comment" type="domain.blog.Comment"/>
<typeAlias alias="Post" type="domain.blog.Post"/>
<typeAlias alias="Section" type="domain.blog.Section"/>
<typeAlias alias="Tag" type="domain.blog.Tag"/>
</typeAliases>
也能够指定一个包名,MyBatis会自动扫描包中的类,自动定义别名(别名即类名,且首字母大小写都可):
<typeAliases>
<package name="domain.blog"/>
<package name="domain.article"/>
<!-- ... -->
</typeAliases>
这个配置每每使得咱们在mapper.xml中指定输入参数和输出结果类型变得简单方便。
MyBatis中也提供了一些默认支持的别名(默认别名的规则是基本数据类型是名称前加下划线,引用数据类型是首字母小写):
别名 |
映射的类型 |
|
别名 |
映射的类型 |
_byte |
byte |
|
double
|
Double
|
_long |
long |
|
float
|
Float
|
_short |
short |
|
boolean |
Boolean
|
_int |
int |
|
date
|
Date
|
_integer |
int |
|
decimal
|
BigDecimal
|
_double |
double |
|
bigdecimal
|
BigDecimal
|
_float |
float |
|
object
|
Object
|
_boolean |
boolean |
|
map
|
Map
|
string |
String |
|
hashmap
|
HashMap
|
byte |
Byte |
|
list
|
List
|
long |
Long |
|
arraylist |
ArrayList |
short |
Short |
|
collection |
Collection |
int |
Integer |
|
iterator |
Iterator |
integer
|
Integer
|
|
|
|
六、typeHandlers
不管是 MyBatis 在预处理语句(PreparedStatement)中设置一个参数时,仍是从结果集中取出一个值时,都会用类型处理器将获取的值以合适的方式转换成 Java 类型,MyBatis 中已有一些默认的类型处理器,此处列举一二仅供参考,详情参考
官方文档:
类型处理器 |
Java类型 |
JDBC类型 |
StringTypeHandler |
java.lang.String |
CHAR, VARCHAR |
DateTypeHandler |
java.util.Date |
TIMESTAMP |
IntegerTypeHandler |
java.lang.Integer, int |
数据库兼容的 NUMERIC 或 INTEGER |
FloatTypeHandler |
java.lang.Float, float |
数据库兼容的 NUMERIC 或 FLOAT |
... |
... |
... |
固然,你也能够选择重写类型处理器或建立你本身的类型处理器来处理不支持的或非标准的类型,具体实现 org.apache.ibatis.type.TypeHandler 接口,或继承 org.apache.ibatis.type.BaseTypeHandler ,一般来讲MyBatis提供的类型处理器已经足够知足平常的开发须要,不须要咱们额外自定义。
<!-- mybatis-config.xml -->
<typeHandlers>
<typeHandler handler="org.mybatis.example.CustomTypeHandler"/>
</typeHandlers>
注意:举例来讲,假如你自定义的类型处理器是用来处理Java的String和JDBC的VARCHAR类型转换,则自定义处理器会覆盖掉原来默认的处理器。