3, mybatis-xml配置

xml配置概述

MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息。 配置文档的顶层结构如下:

configuration(配置)

  • properties(属性)
  • settings(设置)
  • typeAliases(类型别名)
  • typeHandlers(类型处理器)
  • objectFactory(对象工厂)
  • plugins(插件)
  • environments(环境配置)
    • environment(环境变量)
      • transactionManager(事务管理器)
      • dataSource(数据源)
  • 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>

项目地址

mybatis官方文档