MyBatis 主配置文件,即全局配置文件,包含了影响 MyBatis 行为的各种设置与属性信息,其根标签为 ` `,以下所有标签都写在此根标签下。
## properties
`` 标签用于引入外部资源配置文件,例如,不想在主配置文件中写死数据库连接属性,而写在一个外部文件中,例如 `dbconfig.properties`,该文件存放于类路径下,内容如下
```properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/mybatis?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
jdbc.username=root
jdbc.password=root
```
主配置文件引入该文件
```xml
```
其中,`resource` 属性用于引入类路径下资源,`url` 属性用于引入网络资源
则主配置文件中可以使用 `${}` 引入外部资源中的内容
```xml
```
## settings
`` 标签非常重要,它可以改变 MyBatis 的运行时行为,其主要设置有
|设置参数|作用|有效值|默认值|
|---|---|---|---|
|cacheEnabled|关于MyBatis缓存的全局开关|true或false|TRUE|
|lazyLoadingEnabled|所有关联对象是否开启懒加载|true或false|FALSE|
|defaultStatementTimeout|设置超时时间,即等待数据库响应的秒数|任意正整数|null|
|mapUnderscoreToCamelCase|是否开启自动驼峰命名映射,即从数据库字段名ABC_COLUMN到Java字段名abcColumn的映射,以实现自动封装|true或false|FALSE|
例如
```xml
```
## typeAliases
`` 标签用于为 Java 类型设置别名,方便使用,例如
```xml
```
那么,在映射文件中,可以这样使用别名,而不必使用全类名
```xml
insert into User (username,password) value(#{username},#{password})
```
也可以为某一包及其子包下的所有类自动配置别名,默认别名就是leiming,使用 `package` 标签
```xml
```
**注意**
1. 别名不区分大小写
2. 可以使用 `@Alias` 注解为自定义类起别名,例如在 `User` 类上加注解 `@Alias("user")`
3. MyBatis 已经为常见的 Java 内置对象创建了别名,在自定义别名时,不要与之冲突

## typeHandlers
`TypeHandlers` 即类型处理器(类型转换器),无论是 MyBatis 在预处理语句(PreparedStatement)中设置参数,还是从结果集中取出一个值时,都会使用类型处理器 `TypeHandler` 将获取的值以合适的方式转换成 Java 对象,或反之。简而言之,MyBatis 通过类型处理器进行 Java 类型与 JDBC 类型的互转。
MyBatis 内置的类型处理器包括

### 自定义类型处理器
我们可以创建自己的类型处理器来转换原生 MyBatis 不支持的或非标准的类型,以完成特定的需求,例如现在需求一个可以转换 Java `Date` 类型与 MySQL `Long` 类型的转换,也就是说 Java 实体类中的字段是 `Date` 类型,但是使用其 `Long` 型的时间戳存储在数据库中,要完成这个需求,需要两个步骤
1. 编写自定义的类型处理器,实现 `org.apache.ibatis.type.TypeHandler` 接口或者继承 `org.apache.ibatis.type.BaseTypeHandler` 类,并实现其中的四个方法。
```java
package cool.yzt.utils;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import java.sql.*;
import java.util.Date;
// 继承BaseTypeHandler并指明泛型,该泛型就是要转换的Java类
public class MyBatisDateTypeHandler extends BaseTypeHandler {
// 实现四个方法,注意这四个方法都是回调方法,供MyBatis自己调用
// 实现从Java类型到JDBC类型的转换
public void setNonNullParameter(PreparedStatement preparedStatement, int i, Date date, JdbcType jdbcType) throws SQLException {
// setLong方法说明是statement设置long类型的变量,i就是该字段参数的位置
preparedStatement.setLong(i,date.getTime());
}
// 以下三个方法实现从JDBC类型到Java类的转换
public Date getNullableResult(ResultSet resultSet, String s) throws SQLException {
long time = resultSet.getLong(s);
return new Date(time);
}
public Date getNullableResult(ResultSet resultSet, int i) throws SQLException {
long time = resultSet.getLong(i);
return new Date(time);
}
public Date getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
long time = callableStatement.getLong(i);
return new Date(time);
}
}
```
2. 在主配置文件中注册该类型处理器
```xml
```
## environments
MyBatis 可以配置多套环境,例如开发、测试、生产环境需要不同的配置,通过 `default` 属性就可以快速在不同环境之间切换
`` 的一个 `` 子标签就代表一套环境,由其 `id` 属性进行唯一标识,其中 `` 和 `` 是必须要配置的两个标签。
```xml
```
### transactionManager
`type` 属性的可选值为 `JDBC`,`MANAGED`,`自定义`
* `JDBC`:`JdbcTransactionFactory` 的别名,表示使用 JDBC 的提交和回滚设置,即依赖于从数据源的到的连接来管理事务范围
* `MANAGED`:`ManagedTransactionFactory` 的别名,表示不提交或回滚一个连接,而是让容器来管理事务的生命周期
* `自定义`:自定义一个类实现 `TransactionFactory` 接口,将 `type` 设置为该实现类的全类名或别名
### dataSource
`type` 属性的可选值为 `UNPOOLED`,`POOLED`,`JNDI`,`自定义`
* `UNPOOLED`:不使用连接池
* `POOLED`:使用连接池
* `JNDI`:在容器中查找指定的数据源
* `自定义`:自定义一个类实现 `DataSourceFactory` 接口,自定义数据源的获取方式,将 `type` 设置为该实现类的全类名或别名
**注意**
实际开发中,我们使用 Spring 整合 MyBatis,并通过 Spring 进行事务控制和管理数据源,覆盖上述的配置
## mappers
`` 标签用于注册 SQL 映射文件,可以有以下方式
```xml
```
* `resource`:使用 xml 进行映射,指定 xml 文件的包路径
* `url`:使用 xml 进行映射,指定 xml 文件的网络路径或磁盘路径
* `class`:一般用于注解方式配置 sql 映射,不推荐使用注解映射,因为 sql 语句依然写在了代码中
## databaseIdProvider
MyBatis 可以根据不同的数据库厂商执行不同的语句,在主配置文件中加入以下配置,相当于为不同的数据库起别名,方便在映射文件中使用
```xml
```
映射文件的 statement 标签可以加入 `databaseId` 属性,以标识此条 sql 是用于哪种数据库的
```xml
```
## plugins
plagins,即插件,是 MyBatis 提供的一个非常强大的机制,可以通过插件来修改 MyBatis 的一些核心行为,其原理,是通过动态代理机制,接入 MyBatis 四大对象的任何一个方法的执行,四大对象是指 `Executor`,`ParameterHandler`,`ResultSetHandler`,`StatementHandler`。
### pagehelper 插件
pagehelper 是一款用于简化分页查询操作的插件,在之前,我们都是手动实现一个 `PageBean` 类,用于封装和分页有关的各个参数,还需要手写 `limit` 查询语句,进行一些细节的计算,而 pagehelper 插件大大简化了这个过程,要使用 pagehelper,遵循以下步骤
1. 导入相关依赖
```xml
com.github.pagehelper
pagehelper
5.1.11
com.github.jsqlparser
jsqlparser
3.1
```
## 参考
[尚硅谷 MyBatis 教程](https://www.bilibili.com/video/BV1zb411V77d)

MyBatis 主配置文件详解