1、配置文件概述
在创建完配置文件时一定要给配置文件添加约束头,约束头相对固定,使用时直接复制即可:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
在配置文件只有configuration
这一个根元素,在这个元素下有很少的几个顶级元素:
properties
:属性文件,可以加载外部的 properties 文件settings
: 配置typeAliases
: 用于设置类型的别名typeHandlers
:类型处理器objectFactory
:对象工厂plugins
:插件environments
:用于配置数据源环境environment
:环境变量transactionManager
:事务管理器dataSource
:数据源
databaseIdProvider
:数据库厂商标识mappers
:用于加载映射器
上面这些元素标签就是整个配置文件中涉及的所有元素!在配置文件中需要按照上述顺序来定义元素标签,可以省略其中某个标签,但是顺序不能改变。
2、properties 元素
properties
元素标签用于引入外部文件或者设置变量,在这个标签内定义的属性可以在配置文件引用。
<properties>
<property name="name" value="mysql"/>
</properties>
在配置文件的其他位置可以使用${name}
取值。properties
元素还可以引入外部文件:
#我们定义一个 jdbc.properties 资源文件
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
username=root
password=root
<configuration>
<!--引入外部配置文件:优先使用外部文件-->
<!-- 引入完成之后,我们就可以通过 propertie 元素进行引用 -->
<properties resource="jdbc.properties" />
<configuration>
properties
元素标签有两个属性:resource
和url
,都是用于定义地址。resource
定义相对地址文件,url
定义绝对地址文件(且必须加上 file:)。
当配置文件中重复定义了某个属性时,MyBatis 定义了读取顺序:
- 首先读取在 properties 元素体内指定的属性
- 然后根据 properties 元素中的 resource 属性读取类路径下属性文件,或根据 url 属性指定的路径读取属性文件,并覆盖之前读取过的同名属性
- 最后读取作为方法参数传递的属性(Java传值),并覆盖之前读取过的同名属性
我们还可以给属性设置一个默认值,例如:
<properties resource="jdbc.properties">
<!-- 如果属性 'name' 没有被配置,'username' 属性的值默认为'ut_user' -->
<property name="name" value="${name:mysql}"/>
</properties>
如果想要使用这种功能必须要开启占位符功能:
<properties resource="jdbc.properties">
<!-- ... -->
<!-- 启用占位符 -->
<property name="org.apache.ibatis.parsing.PropertyParser.enable-default-value" value="true"/>
<!-- 修改默认值的分隔符,将默认的 : 替换成 ?: -->
<property name="org.apache.ibatis.parsing.PropertyParser.default-value-separator" value="?:"/>
</properties>
总结一下配置:
<properties resource="jdbc.properties">
<!-- 定义一个名为 password 的属性 值为 123456 -->
<!-- 在jdbc.文件中有相同名称的值,所以在之后使用过程中会被覆盖 -->
<property name="password" value="123456"/>
<!-- 启用占位符 -->
<property name="org.apache.ibatis.parsing.PropertyParser.enable-default-value" value="true"/>
<!-- 修改默认值的分隔符,将默认的 : 替换成 ?: -->
<property name="org.apache.ibatis.parsing.PropertyParser.default-value-separator" value="?:"/>
</properties>
3、environments 元素
environments
元素用于环境配置,它下面的子元素environment
用于具体的配置环境。MyBatis 可以适应多种环境,所以可以配置多个environment
。
environments
元素有一个唯一的一个属性default
,用于指定一个默认使用的环境的名称。
environment
元素也有一个唯一的一个属性id
,用于指定当前环境的名称,它有两个子元素:transactionManager
和dataSource
。两个属性的具体用法:
transactionManager
:事务管理器,类型有两种:JDBC
:这个配置就是直接使用了JDBC 的提交和回滚设置,它依赖于从数据源得到的连接来管理事务作用域。MANAGED
:它不提交或回滚一个连接,而是让容器来管理事务的整个生命周期(比如 JEE 应用服务器的上下文),默认情况下它会关闭连接。
dataSource
:配置数据源,可以通过type
属性定义连接池,其属性值有三种:-
UNPOOLED
:这个数据源的实现只是每次被请求时打开和关闭连接。 -
POOLED
:这种数据源的实现利用“池”的概念将 JDBC 连接对象组织起来。 -
JNDI
:这个数据源的实现是为了能在如 EJB 或应用服务器这类容器中使用,容器可以集中或在外部配置数据源,然后放置一个 JNDI 上下文的引用。
-
实际开发中,我们通常将 environments
元素和properties
元素一起使用:
4、typeAliases 元素
typeAliases
元素朱用于为 Java 类型设置一个类型别名。 它主要用于映射文件中,降低全限定类名书写。在映射文件中,我们经常会用到resultType
属性,这个属性用于定义返回结果的全限定名:
<select id="getUserList" resultType="com.***.User">
select * from mybatis.user
</select>
如果多个地方使用了 resultType
属性,那需要重复定义多次,比较繁琐。所以我们可以在配置文件给 Java 类型设置一个类型别名:
<typeAliases>
<typeAlias type="com.***.User" alias="User"/>
</typeAliases>
这样就设置了好了一个类型别名,当然也可以在typeAliases
元素中定义多个类型别名。将映射文件中全限定名的替换:
<!-- resultType 使用的是类型别名 -->
<select id="getUserList" resultType="User">
select * from mybatis.user
</select>
在typeAliases
元素有另外一个package
子元素,用于指定一个包名。MyBatis 会在包名下面搜索需要的 Java Bean。因为是自动扫描的,类的别名就是该类名不能去其他别名。
<typeAliases>
<!-- com.***.pojo 为存放实体类的包名 -->
<package name="com.***.pojo"/>
</typeAliases>
上述我们这是自定义的类型别名,而 Mybatis 也内置了一些常用属性的别名,都是不区分大小写的:
5、mappers 映射器
该标签的作用是加载映射文件的,在 MyBatis 中定义完映射文件之后,我们需要在配置文件中加载映射文件, 加载方式有如下几种:
<mappers>
<!-- 1、使用相对类路径的资源引用 -->
<mapper resource="com/***/UserMapper.xml"/>
<!-- 2、使用绝对类路径的资源引用: -->
<mapper url="file:///var/mappers/CadMapper.xml"/>
</mappers>
除了上述两种方式之外,还有另外的两种方式,这两种方式需要配合注解使用,我们先做了解:
<mappers>
<!-- 使用映射器接口实现类的完全限定类名 -->
<mapper class="org.mybatis.builder.AuthorMapper"/>
<!-- 将包内的映射器接口实现全部注册为映射器 -->
<package name="com.***.Mapper"/>
</mappers>