MyBatis 是一款优秀的持久层框架,通过 XML 或注解将 Java 对象与 SQL 语句映射,极大简化了数据库操作。在实际开发中,合理配置 MyBatis 是提升系统稳定性与性能的关键。本文将重点介绍 配置属性的加载优先级、常用全局设置 以及 多环境(多数据源)配置方法。
一、配置属性的加载优先级
当同一个配置属性在多个地方被定义时,MyBatis 会按照以下顺序加载,并后加载的覆盖先加载的:
<properties>元素体内直接定义的属性- 通过
<properties resource="...">或url="..."加载的外部属性文件 - 通过
SqlSessionFactoryBuilder.build(..., properties)方法参数传入的Properties对象
✅ 最终优先级顺序(从高到低):
方法参数传递的属性 > resource/url 加载的属性文件 > properties 元素内联属性
📌 示例:
若
jdbc.url在db.properties和代码传入的Properties中都存在,则以代码传入的值为准。
二、常用全局配置属性
在 MyBatis 的主配置文件(如 mybatis-config.xml)中,可通过 <settings> 节点配置全局行为。以下是几个关键配置项:
| 设置名 | 描述 | 有效值 | 默认值 |
cacheEnabled |
全局开启/关闭所有映射器中已配置的二级缓存 | true / false |
true |
lazyLoadingEnabled |
开启延迟加载(关联对象按需加载) | true / false |
false |
useGeneratedKeys |
允许 JDBC 自动生成主键(如自增 ID) | true / false |
false |
defaultExecutorType |
默认执行器类型: • SIMPLE:普通执行器• REUSE:重用 PreparedStatement• BATCH:批量执行更新 |
SIMPLE / REUSE / BATCH |
SIMPLE |
localCacheScope |
本地缓存作用域: • SESSION:缓存整个会话中的查询• STATEMENT:仅缓存当前语句 |
SESSION / STATEMENT |
SESSION |
proxyFactory |
延迟加载代理工具 | CGLIB / JAVASSIST |
JAVASSIST(3.3+) |
💡 建议:
- 开发阶段可关闭缓存(
cacheEnabled=false)便于调试;- 批量插入/更新场景建议使用
BATCH执行器;- 若使用 Lombok 或 CGLIB 动态代理冲突,可显式指定
proxyFactory。
三、多环境配置(多数据源支持)
在开发、测试、生产等不同环境中,通常需要连接不同的数据库。MyBatis 通过 <environments> 标签支持多环境配置。
1. 配置示例
<environments default="development"> <!-- 开发环境 --> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="${driver}"/> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> </dataSource> </environment> <!-- 生产环境 --> <environment id="production"> <transactionManager type="MANAGED"/> <dataSource type="POOLED"> <property name="driver" value="${prod.driver}"/> <property name="url" value="${prod.url}"/> <property name="username" value="${prod.username}"/> <property name="password" value="${prod.password}"/> </dataSource> </environment> </environments>
2. 关键说明
default="development":指定默认激活的环境;- 每个
<environment>必须有唯一id; - 每个环境对应一个
SqlSessionFactory,若需同时访问多个数据库,应创建多个SqlSessionFactory实例。
3. Java 代码中指定环境
// 指定使用 "production" 环境 SqlSessionFactory factory = new SqlSessionFactoryBuilder() .build(reader, "production"); // 也可同时传入 Properties SqlSessionFactory factory = new SqlSessionFactoryBuilder() .build(reader, "production", properties);
⚠️ 若未指定环境参数,则自动使用
<environments default="...">中定义的默认环境。
四、事务管理器类型
MyBatis 支持两种事务管理方式:
| 类型 | 说明 |
JDBC |
直接使用 JDBC 的 commit() / rollback(),适用于独立应用 |
MANAGED |
由容器(如 Spring、JEE 应用服务器)管理事务生命周期;默认会关闭连接,若容器不希望关闭,需设置 <property name="closeConnection" value="false"/> |
📌 重要提示:
当 MyBatis 与 Spring 集成 时,无需配置事务管理器,因为 Spring 会通过
DataSourceTransactionManager或JtaTransactionManager自动接管事务,覆盖 MyBatis 的配置。