MyBatis配置详解:全局配置与Mapper映射指南
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
实践建议:
- 读多写少的数据适合开启二级缓存
- 关联复杂的对象缓存需谨慎,可能产生脏读
三、配置最佳实践
- 分环境配置:使用Maven Profile或Spring Profile管理不同环境配置
安全规范:
- 数据库密码等敏感信息应外部化
- 禁止在XML中使用
${}
直接拼接SQL
性能调优:
- 合理设置连接池参数
- 根据场景选择合适的事务管理器
可维护性:
- 大型项目按模块拆分Mapper XML
- 使用
<sql>
片段避免SQL重复
通过深入理解MyBatis的配置文件结构和工作原理,开发者可以更灵活地应对各种持久层需求,构建出既高效又易于维护的数据访问层。