本篇会摘录mybatis全局配置文件中比较常见常用的一些配置进行说明,其实 已经写得足够清晰了(关键是还有中文版完全不慌),此处记录重要还是作为个人的巩固记录。
1、properties
在全局配置文件中,属性的值是可以由外部配置进行动态替换的,这也就使我们把诸如 “数据库连接信息放到单独的文件” 成为可能,这里有两种方式:
- 配置信息放在常见的 .properties 文件中,通过 resource 属性来引入
- 直接通过 property 属性进行定义
如下有 .properties 文件:
jdbc.username=rootjdbc.password=dev
2
1
jdbc.username=root
2
jdbc.password=dev
则我们在配置文件中配置数据库连接信息可以这样:
23
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
属性值通过表达式 ${ } 来读取,如上例中 driver 和 url 将从 properties 的元素 <property> 中读取,而 username 和 url 则可以从 db.properties 中读取。当然,更多情况下我们还是统一写在 .properties 中。需要注意的是,properties 元素体内的属性会优先读取,这意味着如果你在两个地方分别定义了同名的属性,那么最终读取到的值会以 .properties 文件中的为准。
2、environments
2.1 environment
如上例中我们的数据库连接配置是放置在 <environments> 中的 <environment> 标签中,这是MyBatis提供的多环境适应机制,例如开发、测试、生产环境都需要有不同的配置,这意味着假如你有生产环境和开发环境两种配置,你可以这样写:
24
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
- environment 的 id 属性用来区分和定义不同的配置环境
- environments 的 default 用来确定默认使用的配置环境,值是某个 environment 的 id
需要注意的是, 尽管可以配置多个环境,但每个 SqlSessionFactory 实例只能选择其一,如果想连接两个数据库,就需要创建两个 SqlSessionFactory 实例,每个数据库对应一个。
为了确定创建哪种环境,我们往往需要将其作为参数传给 SqlSessionFactoryBuilder :
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, environment);SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, environment, properties);
2
1
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, environment);
2
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, environment, properties);
如果忽略将 environment 作为参数传入,则会加载默认的环境:
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, properties);
2
1
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);
2
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 上下文的引用
3、mappers
mappers是用来让告诉MyBatis去哪找到那些执行的SQL语句,可以使用 相对于类路径的资源引用, 或 完全限定资源定位符(包括 file:/// 的 URL),或 类名和 包名等:
25
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
4、settings
在标题1-3中是MyBatis最最基本需要我们改变的配置信息,而settings则是用来改变MyBatis运行时行为的重要调整设置,因为属性较多此处不再细细展开,详见 ,如下例为官方提供的部分示例,以在此处做简要说明:
32
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
5、typeAliases
类型别名是为 Java 类型设置一个短的名字。它只和 XML 配置有关,存在的意义仅在于用来减少类完全限定名的冗余,如下配置时 “Blog可以用在任何使用domain.blog.Blog的地方”:
8
1
2
3
4
5
6
7
8
也可以指定一个包名,MyBatis会自动扫描包中的类,自动定义别名(别名即类名,且首字母大小写均可):
5
1
2
3
4
5
这个配置往往使得我们在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 |
6、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提供的类型处理器已经足够满足日常的开发需要,不需要我们额外自定义。
4
1
2
3
4
注意:举例来说,假如你自定义的类型处理器是用来处理Java的String和JDBC的VARCHAR类型转换,则自定义处理器会覆盖掉原来默认的处理器。