Appearance
MyBatis 核心配置文件
mybatis-config.xml 是 MyBatis 的全局配置文件,控制着 MyBatis 的行为和运行环境。配置项有严格的顺序要求。
一、配置结构
mybatis-config.xml 配置项(必须按此顺序):
configuration
├─ properties → 属性(引入外部配置)
├─ settings → 全局设置(行为开关)
├─ typeAliases → 类型别名
├─ typeHandlers → 类型处理器
├─ objectFactory → 对象工厂
├─ plugins → 插件
├─ environments → 环境配置(数据源、事务)
├─ databaseIdProvider → 数据库厂商标识
└─ mappers → Mapper 映射注册如果顺序写错,MyBatis 会报 XML 解析错误。
二、properties(属性)
作用:引入外部配置文件,实现配置分离
三种方式:
① properties 标签内直接定义
② 引入外部 .properties 文件
③ 通过 SqlSessionFactoryBuilder.build() 方法参数传入db.properties:
properties
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis_demo?useSSL=false&serverTimezone=Asia/Shanghai
jdbc.username=root
jdbc.password=123456xml
<!-- 引入外部属性文件 -->
<properties resource="db.properties">
<!-- 也可以在内部直接定义(优先级低于外部文件) -->
<!-- <property name="jdbc.username" value="root"/> -->
</properties>
<!-- 使用属性 -->
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>加载优先级(从高到低):
① 方法参数传入的 properties
② resource/url 引入的 properties 文件
③ properties 标签内定义的 property
如果 key 重复,优先级高的覆盖优先级低的。三、settings(全局设置)
settings 是 MyBatis 最核心的配置,控制着 MyBatis 的运行时行为。
xml
<settings>
<!-- ========== 必备配置 ========== -->
<!-- 驼峰命名自动映射:user_name → userName -->
<setting name="mapUnderscoreToCamelCase" value="true"/>
<!-- 日志实现 -->
<setting name="logImpl" value="SLF4J"/>
<!-- ========== 缓存配置 ========== -->
<!-- 全局开启/关闭二级缓存(默认 true) -->
<setting name="cacheEnabled" value="true"/>
<!-- ========== 延迟加载 ========== -->
<!-- 延迟加载总开关(默认 false) -->
<setting name="lazyLoadingEnabled" value="true"/>
<!-- 按需加载:调用 equals/clone/hashCode/toString 也会触发加载 -->
<setting name="aggressiveLazyLoading" value="false"/>
<!-- ========== 执行器 ========== -->
<!-- 默认执行器类型:SIMPLE / REUSE / BATCH -->
<setting name="defaultExecutorType" value="SIMPLE"/>
<!-- ========== 返回主键 ========== -->
<!-- 允许 JDBC 自动生成主键 -->
<setting name="useGeneratedKeys" value="true"/>
<!-- ========== 超时 ========== -->
<!-- 查询超时时间(秒),默认不限制 -->
<setting name="defaultStatementTimeout" value="25"/>
<!-- ========== 映射 ========== -->
<!-- 返回 null 值(而不是空对象) -->
<setting name="returnInstanceForEmptyRow" value="false"/>
</settings>常用 settings 速查:
| 设置项 | 默认值 | 说明 |
|---|---|---|
| mapUnderscoreToCamelCase | false | 下划线转驼峰 |
| cacheEnabled | true | 二级缓存开关 |
| lazyLoadingEnabled | false | 延迟加载开关 |
| aggressiveLazyLoading | true | 激进延迟加载(3.4.1+ 改为 false) |
| useGeneratedKeys | false | 是否使用 JDBC getGeneratedKeys |
| defaultExecutorType | SIMPLE | 执行器类型 |
| defaultStatementTimeout | 无限制 | 查询超时 |
| logImpl | 未设置 | 日志实现 |
| localCacheScope | SESSION | 一级缓存作用域 |
四、typeAliases(类型别名)
作用:给 Java 类型起短名,方便在 Mapper XML 中引用
三种方式:
① 单独定义别名
② 扫描包自动别名(推荐)
③ 给实体类加 @Alias 注解xml
<typeAliases>
<!-- 方式一:逐一配置 -->
<typeAlias type="com.example.entity.User" alias="User"/>
<!-- 方式二:扫描包(自动取类名首字母小写作为别名) -->
<package name="com.example.entity"/>
</typeAliases>java
// 方式三:注解方式(优先级最高)
@Alias("User")
public class User { ... }使用别名后,Mapper XML 中可以直接写短名:
resultType="User" // 等价于 resultType="com.example.entity.User"
resultType="user" // 包扫描的默认别名(首字母小写)MyBatis 内置别名:
| 别名 | 类型 |
|---|---|
| _byte | byte |
| _long | long |
| _short | short |
| _int | int |
| _integer | int |
| _double | double |
| _float | float |
| _boolean | boolean |
| string | String |
| byte | Byte |
| long | Long |
| short | Short |
| int | Integer |
| integer | Integer |
| double | Double |
| float | Float |
| boolean | Boolean |
| date | Date |
| decimal | BigDecimal |
| bigdecimal | BigDecimal |
| map | Map |
| hashmap | HashMap |
| list | List |
| arraylist | ArrayList |
| collection | Collection |
| iterator | Iterator |
五、environments(环境配置)
作用:配置数据库连接环境,支持多环境切换
transactionManager 类型:
JDBC → 使用 JDBC 的事务管理(commit/rollback)
MANAGED → 由容器管理事务(如 Spring)
dataSource 类型:
POOLED → 使用 MyBatis 内置连接池(推荐)
UNPOOLED → 不使用连接池,每次新建连接
JNDI → 从 JNDI 容器获取数据源xml
<environments default="development">
<!-- 开发环境 -->
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
<!-- 连接池配置 -->
<property name="poolMaximumActiveConnections" value="20"/>
<property name="poolMaximumIdleConnections" value="10"/>
<property name="poolMaximumCheckoutTime" value="20000"/>
<property name="poolTimeToWait" value="20000"/>
<property name="poolPingQuery" value="SELECT 1"/>
<property name="poolPingEnabled" value="true"/>
</dataSource>
</environment>
<!-- 生产环境 -->
<environment id="production">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${prod.jdbc.driver}"/>
<property name="url" value="${prod.jdbc.url}"/>
<property name="username" value="${prod.jdbc.username}"/>
<property name="password" value="${prod.jdbc.password}"/>
</dataSource>
</environment>
</environments>六、mappers(映射器注册)
作用:告诉 MyBatis 去哪里找 SQL 映射文件
四种方式:
① resource → 引用 XML 文件(推荐用于 XML 在 resources 下)
② url → 引用绝对路径
③ class → 引用 Mapper 接口(接口和 XML 同目录)
④ package → 扫描包(最常用)xml
<mappers>
<!-- 方式一:逐个注册 XML 文件 -->
<mapper resource="mapper/UserMapper.xml"/>
<mapper resource="mapper/OrderMapper.xml"/>
<!-- 方式二:URL 绝对路径 -->
<mapper url="file:///D:/mappers/UserMapper.xml"/>
<!-- 方式三:注册接口(要求 XML 和接口同目录) -->
<mapper class="com.example.mapper.UserMapper"/>
<!-- 方式四:扫描包(推荐,Spring Boot 常用) -->
<package name="com.example.mapper"/>
</mappers>必须满足:
① interface 的全限定名 = XML 的 namespace
② interface 的方法名 = XML 的 id
③ XML 和 interface 在同一路径下(或通过 resource 指定)七、配置速记
mybatis-config.xml 核心配置记法:
properties → 引入配置(数据库连接信息)
settings → 全局开关(驼峰、缓存、日志、延迟加载)
typeAliases → 取别名(短名代替全限定名)
environments → 环境(数据源 + 事务管理器)
mappers → 注册映射(XML 或接口)八、面试要点
| 问题 | 答案要点 |
|---|---|
| 配置项顺序? | properties → settings → typeAliases → ... → mappers |
| 如何切换环境? | environments 的 default 属性 |
| 别名怎么配置? | typeAliases 标签 + @Alias 注解 |
| 内置连接池配置? | poolMaximumActiveConnections 等属性 |
