MyBatis配置文件深度解析:从全局配置到Mapper映射

MyBatis作为Java生态中广泛使用的持久层框架,其配置文件是框架运行的基础。本文将深入剖析MyBatis的两类核心配置文件:全局配置文件(mybatis-config.xml)和Mapper XML文件,帮助开发者掌握配置精髓。

一、全局配置文件(mybatis-config.xml)

全局配置文件是MyBatis的核心配置文件,通常命名为mybatis-config.xml,它包含了框架运行所需的各种全局设置。

1. 环境配置(environments)

<environments default="development">
  <environment id="development">
    <transactionManager type="JDBC"/>
    <dataSource type="POOLED">
      <property name="driver" value="com.mysql.jdbc.Driver"/>
      <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
      <property name="username" value="root"/>
      <property name="password" value="password"/>
    </dataSource>
  </environment>
</environments>

关键点:

  • 可配置多个环境,通过default指定默认环境
  • 事务管理器类型:JDBC(直接使用JDBC提交和回滚)或MANAGED(容器管理)
  • 数据源类型:UNPOOLED(每次请求打开关闭连接)、POOLED(连接池)、JNDI(容器提供)

实践建议:

  • 生产环境推荐使用POOLED数据源
  • 不同环境(dev/test/prod)配置应分开,可通过属性文件或Maven Profile管理

2. 属性配置(properties)

<properties resource="db.properties">
  <property name="username" value="dev_user"/>
</properties>

特性:

  • 支持外部属性文件(resource/url)和内联属性
  • 属性可被其他配置引用:${driver}
  • 优先级:方法参数传递 > resource/url属性 > 内联属性

实践建议:

  • 敏感信息(如密码)应放在外部属性文件,并排除在版本控制外
  • 使用统一命名规范,如数据库相关属性以db.前缀

3. 类型别名(typeAliases)

<typeAliases>
  <typeAlias alias="User" type="com.example.model.User"/>
  <package name="com.example.model"/>
</typeAliases>

作用:

  • 简化XML配置中的长类名引用
  • 内置常见Java类型别名,如string->java.lang.String
  • 包扫描自动将类名首字母小写作为别名

实践建议:

  • 推荐使用包扫描方式减少配置
  • 对于DTO/VO等频繁引用的类可显式定义易记别名

4. 类型处理器(typeHandlers)

<typeHandlers>
  <typeHandler handler="com.example.handler.MyEnumTypeHandler"/>
  <package name="com.example.handler"/>
</typeHandlers>

功能:

  • 处理Java类型与JDBC类型间的转换
  • 内置处理器覆盖大部分常见类型(数值、日期等)
  • 自定义处理器需实现TypeHandler接口或继承BaseTypeHandler

实践建议:

  • 枚举类型通常需要自定义处理器
  • 复杂JSON字段可考虑实现自定义处理器

5. 插件(plugins)

<plugins>
  <plugin interceptor="com.example.plugin.MyInterceptor">
    <property name="someProperty" value="100"/>
  </plugin>
</plugins>

能力:

  • 拦截四大对象:Executor、StatementHandler、ParameterHandler、ResultSetHandler
  • 典型应用:分页、性能监控、SQL改写
  • 需使用@Intercepts@Signature注解定义拦截点

实践建议:

  • 插件会增加调用链深度,应谨慎使用
  • 推荐使用成熟插件如PageHelper

6. 数据库厂商标识(databaseIdProvider)

<databaseIdProvider type="DB_VENDOR">
  <property name="MySQL" value="mysql"/>
  <property name="Oracle" value="oracle"/>
</databaseIdProvider>

用途:

  • 支持多数据库厂商的SQL差异化
  • 在Mapper XML中使用databaseId属性指定厂商特定SQL

实践建议:

  • 多数据库支持项目必备配置
  • 测试时应覆盖所有目标数据库

7. 映射器注册(mappers)

<mappers>
  <mapper resource="com/example/mapper/UserMapper.xml"/>
  <mapper class="com.example.mapper.UserMapper"/>
  <package name="com.example.mapper"/>
</mappers>

注册方式:

  • XML文件路径(resource/url)
  • Mapper接口类(class)
  • 包扫描(package)

实践建议:

  • 推荐接口与XML同名同路径,便于维护
  • 包扫描可减少配置但需遵循命名规范

二、Mapper XML文件

Mapper XML文件定义了具体的SQL映射规则,是业务SQL的载体。

1. 命名空间(namespace)

<mapper namespace="com.example.mapper.UserMapper">

关键点:

  • 必须对应Mapper接口的全限定名
  • 是SQL语句的隔离单位,避免ID冲突

2. SQL语句定义

<select id="selectUser" resultType="User">
  SELECT * FROM user WHERE id = #{id}
</select>

语句类型:

  • select/insert/update/delete
  • 参数传递:#{property}(预编译)或${property}(直接替换)

实践建议:

  • 优先使用#{}防止SQL注入
  • 复杂查询应考虑使用<include>重用SQL片段

3. 结果映射(resultMap)

<resultMap id="userResultMap" type="User">
  <id property="id" column="user_id"/>
  <result property="username" column="user_name"/>
  <association property="department" javaType="Department"/>
</resultMap>

能力:

  • 自定义列到属性的映射规则
  • 支持嵌套关联(association)和集合(collection)
  • 可继承其他resultMap

实践建议:

  • 复杂对象关系推荐使用显式resultMap
  • 开启自动映射(autoMappingBehavior)简化简单映射

4. 缓存配置

<cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true"/>

配置项:

  • 回收策略:LRU/FIFO/SOFT/WEAK
  • 刷新间隔、引用数量、是否只读
  • 需实体类实现Serializable

实践建议:

  • 读多写少的数据适合开启二级缓存
  • 关联复杂的对象缓存需谨慎,可能产生脏读

三、配置最佳实践

  1. 分环境配置:使用Maven Profile或Spring Profile管理不同环境配置
  2. 安全规范

    • 数据库密码等敏感信息应外部化
    • 禁止在XML中使用${}直接拼接SQL
  3. 性能调优

    • 合理设置连接池参数
    • 根据场景选择合适的事务管理器
  4. 可维护性

    • 大型项目按模块拆分Mapper XML
    • 使用<sql>片段避免SQL重复

图1

通过深入理解MyBatis的配置文件结构和工作原理,开发者可以更灵活地应对各种持久层需求,构建出既高效又易于维护的数据访问层。

添加新评论