properties 配置参数
作用:可以在整个配置文件中使用,替换需要动态配置的属性值
配置文件
1 |
|
两种方法都使用的情况下,以外部指定的配置文件为准。原因见下面源码:
XMLConfigBuilder # propertiesElement()
1 |
|
environments 数据库环境
作用:配置数据库环境,可以多个
配置文件
1 |
|
注意:
- 一个
<environment/>
对应一个数据库,一个数据库对应一个SqlSessionFactory
; - 每个
<environment/>
有一个 id,<environments/>
的default属性要对应其中一个id; - 每个
<environment/>
需要配置事务管理器<transactionManager/>
和数据源<dataSource/>
; - 事务管理器
<transactionManager/>
有两种类型(也就是 type=”[JDBC or MANAGED]”),JDBC直接使用JDBC的事务,MANAGED则是将事务托管给容器;
NOTE: 如果使用 Spring + MyBatis,则没有必要配置事务管理器, 因为 Spring 模块会使用自带的管理器来覆盖前面的配置。
- 数据源
<dataSource/>
有三种内建的数据源类型(也就是 type=”[UNPOOLED or POOLED or JNDI]”)
源码简析
1 |
|
typeAliases 别名
作用:为Java的限定类名指定一个简短的别名
配置文件
1 |
|
<typeAliases/>
有两类子节点:
<typeAlias/>
:为某个类指定别名,alias
属性可选,不设置时默认为非限定类名的小写;<package/>
:为某个package下所有(非匿名/接口/局部类)类指定别名,若类无@Alias
注解,默认为非限定类名的小写;
要求:package 标签必须在 typeAlias 后面
源码简析
来看源码:
XMLConfigBuilder#typeAliasesElement()
1 |
|
注册 package 子标签所指向的包下类
TypeAliasRegistry.java
1 |
|
如果有
@Alias
注解,则用其值,否则用非限定类名;
对单个 typeAlias 的解析也会进到这里
1 |
|
总结一下:
- 通过
<typeAlias/>
标签可以单独为某个类设置别名; - 通过
<package/>
标签可以为某个包下所有类设置别名(匿名类、接口、局部类除外); <typeAlias/>
不指定别名,则用类的非限定名作为别名;<package/>
若没在类上加@Alias
注解,则用类的非限定名作为别名;- 类的别名注册在一个Map中,key(别名)实际都是小写的,但mapper文件中使用时不分大小写;
- 有些我们可以直接在Mapper文件中使用的别名(如string/int等),是Mybatis提前给注册好的。
typeHandlers 类型处理器
作用:自定义方法参数或返回体的java类型和数据库类型的映射
配置文件
1 |
|
源码简析
1 |
|
TypeHandlerRegistry.java
在这个类中,Mybatis已经注册了很多默认的 handler
来看几个注册方法:
1 |
|
所谓的注册和 typeAlias 一样,就是添加到Map中。
实现一个自定义的 TypeHandler
Mybatis 实现了很多默认的 handler,都是继承自 BaseTypeHandler
,我们要实现自己的自定义Handler,也需要继承这个类。
1 |
|
然后在配置文件中配置:
1 |
|
objectFactory 对象工厂
Mybatis 每次创建结果对象的新实例时,它都会使用一个对象工厂(ObjectFactory)实例来完成。 默认的对象工厂需要做的仅仅是实例化目标类,要么通过默认构造方法,要么在参数映射存在的时候通过参数构造方法来实例化。 默认情况下,我们不需要配置,mybatis会调用默认实现的objectFactory。 除非我们要自定义ObjectFactory的实现, 那么我们才需要去手动配置。
自定义ObjectFactory只需要去继承DefaultObjectFactory(是ObjectFactory接口的实现类),并重写其方法即可。 具体的,本处不多说,后面再具体讲解。
写好了ObjectFactory, 仅需做如下配置:
1 |
|
源码如下:
1 |
|
plugins 插件
plugins 是一个可选配置。mybatis中的plugin其实就是个interceptor
, 它可以拦截Executor
、ParameterHandler
、ResultSetHandler
、StatementHandler
的部分方法,处理我们自己的逻辑。
- Executor就是真正执行sql语句的东西;
- ParameterHandler 是处理我们传入参数的,还记得前面讲TypeHandler的时候提到过,mybatis默认帮我们实现了不少的typeHandler, 当我们不显式配置typeHandler的时候,mybatis会根据参数类型自动选择合适的typeHandler执行,其实就是ParameterHandler 在选择。
- ResultSetHandler 就是处理返回结果的。
要自定义一个plugin, 需要去实现Interceptor接口, 这儿不细说, 后面实战部分会详细讲解。定义好之后,配置如下:
1 |
|
源码如下:
1 |
|
有一个常用的插件——分页插件(PageHelper),可以方便地实现分页功能:
1 |
|
mappers 映射文件
mappers 节点下,配置我们的mapper映射文件, 所谓的mapper映射文件,就是让mybatis 用来建立数据表和javabean映射的一个桥梁。 在我们实际开发中,通常一个mapper文件对应一个dao接口, 这个mapper可以看做是dao的实现。所以,mappers必须配置。
1 |
|
源码如下:
1 |
|
其它
Mybatis的配置文件中,除了上面讲到的标签,还有以下几种尚未提及:
<settings/>
,设置能影响Mybatis运行时行为的一些参数,这些参数都是Configuration
类里的属性,此处列举几个:- cacheEnabled:所有映射器中配置的缓存的全局开关;
- lazyLoadingEnabled:延迟加载的全局开关;
- useGeneratedKeys:允许 JDBC 支持自动生成主键,需要驱动兼容;
- autoMappingBehavior:指定 MyBatis 应如何自动映射列到字段或属性[NONE, PARTIAL, FULL];
- mapUnderscoreToCamelCase:是否开启自动驼峰命名规则映射;
- logImpl:指定 MyBatis 所用日志的具体实现,未指定时将自动查找;
- …
<databaseIdProvider/>
,使 MyBatis 可以根据不同的数据库厂商执行不同的语句;<objectWrapperFactory/>
:不知啥用,直到了再补<reflectorFactory/>
:同上
总结
本文介绍了Mybatis配置文件中出现的相关标签的功能作用,并顺带简单地过了一下其源码的解析过程。 相信看完此文,对Mybatis的配置文件多少能有一点了解。 接下来,将会继续深入源码,看一些更有意思的东西。