xml配置概述
MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息。 配置文档的顶层结构如下:
configuration(配置)
- properties(属性)
- settings(设置)
- typeAliases(类型别名)
- typeHandlers(类型处理器)
- objectFactory(对象工厂)
- plugins(插件)
- environments(环境配置)
- environment(环境变量)
- transactionManager(事务管理器)
- dataSource(数据源)
- environment(环境变量)
- databaseIdProvider(数据库厂商标识)
- mappers(映射器)
本质上就是构建org.apache.ibatis.session.Configuration配置对象, mybatis会把配置文件解析成Configuration对象。
# Configuration.build(...)
public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties) {
try {
XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, environment, properties);
return build(parser.parse());
} catch (Exception e) {
...
} finally {
...
}
}
# XMLConfigBuilder.parse()
public Configuration parse() {
if (parsed) {
throw new BuilderException("Each XMLConfigBuilder can only be used once.");
}
parsed = true;
parseConfiguration(parser.evalNode("/configuration"));
return configuration;
}
属性(properties)
配置方式
- 外部properties文件
- 内部配置
- 方法传参
外部properties文件
mybatis-config-05.xml, prop.properties, 导入到configuration中
# prop.properties
username=root
password=root
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://172.28.149.239:3306/test?useSSL=false
# mybatis-config-05.xml
<configuration>
<properties resource="prop.properties"/>
...
</configuration>
内部配置
mybatis-config-06.xml 直接使用
<configuration>
<properties>
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://172.28.149.239:3306/test?useSSL=false"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</properties>
...
</configuration>
方法传参
SqlSessionFactory的build方法, 可以直接传入属性
public SqlSessionFactory build(InputStream inputStream, Properties properties) {
...
}
public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties) {
...
}
当相同属性出现在多个配置方法中时, 优先级别: 方法传参 > 外部properties文件 > 内部配置
设置(settings)
这是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为。 下表描述了设置中各项设置的含义、默认值等。
类型别名(typeAliases)
类型别名可为 Java 类型设置一个缩写名字。 它仅用于 XML 配置,意在降低冗余的全限定类名书写。
配置方式
- 直接配置
- 包扫描+注解
直接配置
<typeAliases>
<typeAlias alias="Author" type="domain.blog.Author"/>
<typeAlias alias="Blog" type="domain.blog.Blog"/>
</typeAliases>
包扫描+注解
<typeAliases>
<package name="domain.blog"/>
</typeAliases>
# Blog.java
@Alias("blog")
public class Blog {
...
}
类型处理器(typeHandlers)
有默认类型处理器, 一般不用配置, 当然你也可以直接实现一个处理器, 具体做法为:实现 org.apache.ibatis.type.TypeHandler 接口, 或继承一个很便利的类 org.apache.ibatis.type.BaseTypeHandler。
处理枚举类型
一般不用配置
对象工厂(objectFactory)
默认即可
插件(plugins)
MyBatis 允许你在映射语句执行过程中的某一点进行拦截调用。默认情况下,MyBatis 允许使用插件来拦截的方法调用包括:
- Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed) -- 执行sql
- ParameterHandler (getParameterObject, setParameters) --获取、设置参数
- ResultSetHandler (handleResultSets, handleOutputParameters) --处理结果集
- StatementHandler (prepare, parameterize, batch, update, query) --记录sql
如果你想做的不仅仅是监控方法的调用,那么你最好相当了解要重写的方法的行为。 因为在试图修改或重写已有方法的行为时,很可能会破坏 MyBatis 的核心模块。 这些都是更底层的类和方法,所以使用插件的时候要特别当心。
通过 MyBatis 提供的强大机制,使用插件是非常简单的,只需实现 Interceptor 接口,并指定想要拦截的方法签名即可。
案例: example07, 自定义插件, 实现sql输出
# 1, 实现Interceptor接受
public class SqlConsoleInterceptor implements Interceptor
# 2, 使用Intercepts注解
@Intercepts(value = { @Signature(type = StatementHandler.class, //这里对应4个类
method = "update", //这里对应4个类里面的参数
args = { Statement.class }) }) //这里的参数类型,是对应4个类中的各种方法的参数。如果方法没有参数,这里直接写{}就可以了
# 3, 实现业务逻辑
# 4, 修改配置文件
<plugins>
<plugin interceptor="top.itkaoti.example07.demo.SqlConsoleInterceptor"/>
</plugins>
注意配置文件节点的顺序问题, properties > settings > typeAliases > typeHandlers > objectFactory > objectWrapperFactory > reflectorFactory > plugins > environments > databaseIdProvider > mappers
参考: MyBatis7:MyBatis插件及示例----打印每条SQL语句及其执行时间
环境配置(environments)
MyBatis 可以配置成多种环境, 例如:测试, 开发, 线上, **不过要记住:尽管可以配置多个环境,但每个 SqlSessionFactory 实例只能选择一种环境。**如果要链接多个数据库, 就要创建多个SqlSessionFactory 实例
事务管理器(transactionManager)
在 MyBatis 中有两种类型的事务管理器(也就是 type="[JDBC|MANAGED]"),
- JDBC – 这个配置直接使用了 JDBC 的提交和回滚设施,它依赖从数据源获得的连接来管理事务作用域。
- MANAGED – 这个配置几乎没做什么。它从不提交或回滚一个连接,而是让容器来管理事务的整个生命周期(比如 JEE 应用服务器的上下文)。 默认情况下它会关闭连接。然而一些容器并不希望连接被关闭,因此需要将 closeConnection 属性设置为 false 来阻止默认的关闭行为。
数据源(dataSource)
dataSource 元素使用标准的 JDBC 数据源接口来配置 JDBC 连接对象的资源。
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
<property name="defaultTransactionIsolationLevel" value="${defaultTransactionIsolationLevel}"/>
</dataSource>
Type: POOLED , JNDI
POOLED – 这种数据源的实现利用“池”的概念将 JDBC 连接对象组织起来,避免了创建新的连接实例时所必需的初始化和认证时间。
JMDI - 这个数据源实现是为了能在如 EJB 或应用服务器这类容器中使用,容器可以集中或在外部配置数据源,然后放置一个 JNDI 上下文的数据源引用。
数据库厂商标识(databaseIdProvider)
映射器(mappers)
- 相对于类路径的资源引用
<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>