MyBatis 全局配置(mybatis-config.xml)
mybatis-config.xml 是原生方式的"总开关":settings 控制全局行为、typeAliases 给类起短名、environments 定义数据库环境,最后通过 mappers 注册映射文件。它放在 classpath 根目录,由 SqlSessionFactoryBuilder 加载。
顶层元素与书写顺序
MyBatis 对配置文件的顶层元素顺序有严格要求,写错会解析报错(以官方文档为准),从上到下依次是:
properties → settings → typeAliases → typeHandlers → objectFactory →
objectWrapperFactory → reflectorFactory → plugins → environments →
databaseIdProvider → mappers
除最外层 configuration 外,多数元素可省略。本章只讲最常用的三个:settings、typeAliases、environments。
properties:引入外部属性
数据库账号密码建议放进 db.properties,用 ${key} 引用:
<properties resource="db.properties"/>
...
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
</dataSource>
同名属性在多个位置定义时,覆盖规则(代码传入 > resource/url 加载 > properties 内联)以官方文档为准。
settings:全局设置
settings 是排查"行为不对劲"的第一站,常用项如下(默认值以官方文档为准):
| 设置项 | 作用 | 默认值 |
|---|---|---|
| cacheEnabled | 二级缓存全局开关 | true |
| lazyLoadingEnabled | 嵌套查询延迟加载总开关 | false |
| mapUnderscoreToCamelCase | user_name 自动映射为 userName | false |
| defaultExecutorType | 执行器类型 SIMPLE/REUSE/BATCH | SIMPLE |
| localCacheScope | 一级缓存作用域 SESSION/STATEMENT | SESSION |
| useGeneratedKeys | 是否默认开启自增主键回填 | false |
| callSettersOnNulls | 值为 null 时是否调用 setter | false |
| autoMappingBehavior | 自动映射级别 NONE/PARTIAL/FULL | PARTIAL |
| logImpl | 日志实现,如 SLF4J、LOG4J2、STDOUT_LOGGING | 自动探测 |
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
学习阶段把 logImpl 设为 STDOUT_LOGGING,SQL 与参数会直接打印到控制台,方便观察执行过程。
typeAliases:类型别名
给实体类起短名,映射文件里就不用写一长串全限定名:
<typeAliases>
<typeAlias alias="user" type="com.example.entity.User"/>
<!-- 整包扫描:包下每个类自动以"简单类名"注册别名 -->
<package name="com.example.entity"/>
</typeAliases>
- 包扫描的别名 = 类简单名,且不区分大小写:
resultType="user"与resultType="User"都行;类上加@Alias("user")可显式指定。 - MyBatis 内置一批别名:
int、_int、string、map、list、date等,覆盖基本类型与常用类(完整列表以官方文档为准)。 - 别名注册后,各处 resultType/parameterType 都能直接用:
resultType="user"即代表 com.example.entity.User。
environments:数据库环境
environments 用 default 指定默认环境,可同时配多套(开发/测试/生产)随时切换:
<environments default="dev">
<environment id="dev">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/demo"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
- transactionManager:
JDBC(手动提交/回滚)或MANAGED(交给容器管理事务)。 - dataSource:
UNPOOLED(每次新建连接)、POOLED(自带连接池)、JNDI(容器提供)。
databaseIdProvider 与 mappers
- databaseIdProvider:按数据库厂商(MySQL/Oracle 等)给语句加 databaseId,一套映射适配多种数据库。
- mappers:注册映射文件或接口:
<mappers>
<mapper resource="mapper/UserMapper.xml"/> <!-- 类路径 XML -->
<package name="com.example.mapper"/> <!-- 包内所有接口(注解或同名同包 XML) -->
</mappers>
class 属性可注册单个接口(要求 XML 与接口同名同包或在注解里);url 可指向文件系统路径。
小结
settings 决定行为、typeAliases 缩短类名、environments 管连接、mappers 注册语句,四者配合即可支撑原生开发。接入 Spring 后 environments 往往不再需要,数据源与事务都交给 Spring(见第 15、16 章)。