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
mapUnderscoreToCamelCaseuser_name 自动映射为 userNamefalse
defaultExecutorType执行器类型 SIMPLE/REUSE/BATCHSIMPLE
localCacheScope一级缓存作用域 SESSION/STATEMENTSESSION
useGeneratedKeys是否默认开启自增主键回填false
callSettersOnNulls值为 null 时是否调用 setterfalse
autoMappingBehavior自动映射级别 NONE/PARTIAL/FULLPARTIAL
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_intstringmaplistdate 等,覆盖基本类型与常用类(完整列表以官方文档为准)。
  • 别名注册后,各处 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 章)。

笔记加载中…