MyBatis 常见配置详解:属性优先级、执行器与多环境支持

简介: MyBatis 是优秀的持久层框架,简化数据库操作。本文详解配置属性加载优先级(代码 > 外部文件 > 内联)、常用全局设置(如缓存、延迟加载)及多环境多数据源配置方法,助力提升系统稳定与性能。

MyBatis 是一款优秀的持久层框架,通过 XML 或注解将 Java 对象与 SQL 语句映射,极大简化了数据库操作。在实际开发中,合理配置 MyBatis 是提升系统稳定性与性能的关键。本文将重点介绍 配置属性的加载优先级常用全局设置 以及 多环境(多数据源)配置方法

一、配置属性的加载优先级

当同一个配置属性在多个地方被定义时,MyBatis 会按照以下顺序加载,并后加载的覆盖先加载的

  1. <properties> 元素体内直接定义的属性
  2. 通过 <properties resource="...">url="..." 加载的外部属性文件
  3. 通过 SqlSessionFactoryBuilder.build(..., properties) 方法参数传入的 Properties 对象

最终优先级顺序(从高到低):  

方法参数传递的属性 > resource/url 加载的属性文件 > properties 元素内联属性

📌 示例:

jdbc.urldb.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 会通过 DataSourceTransactionManagerJtaTransactionManager 自动接管事务,覆盖 MyBatis 的配置。


相关文章
|
8月前
|
SQL Java 数据库连接
MyBatis 分页机制详解:从 RowBounds 到物理分页实践
MyBatis分页策略解析:逻辑分页(RowBounds)将全量数据加载至内存,仅适用于小数据量;物理分页通过SQL层面限制返回数据,性能更优。推荐使用PageHelper插件,自动适配数据库方言,一行代码实现高效分页,避免OOM风险,提升系统稳定性。
|
缓存 负载均衡 前端开发
Nginx极简入门(九)Nginx实现动静分离!
前面介绍了Nginx的负载均衡,一般来说,都需要将动态资源和静态资源分开,这样可以很大程度的提升静态资源的访问速度,同时在开过程中也可以让前后端开发并行可以有效的提高开发时间,也可以有些的减少联调时间 。接下来介绍什么是动静分离以及如何使用Nginx实现动静分离。
Nginx极简入门(九)Nginx实现动静分离!
|
6月前
|
安全 Java API
Spring Boot 4 升级实战:从3.x到4.0的分步升级保姆级指南
Spring Boot 4.0于2025年11月发布,基于Spring Framework 7.0,实现模块化(47个轻量自动配置)、JSpecify空安全校验、原生API版本控制等重大升级。镜像减19%、启动快33%,迁移平滑,3.5.x支持至2026年11月。(239字)
5995 1
|
存储 运维 算法
蚂蚁Raft一致性算法库SOFAJRaft深入分析
大家好,我是 V 哥。SOFAJRaft 是蚂蚁金服开源的一款基于 Raft 共识算法的 Java 实现,特别适合高负载、低延迟的分布式系统。它支持 Multi-Raft-Group,能同时处理多个 Raft 集群,具备扩展性和强一致性保障。项目源自百度的 braft,并在性能和功能上进行了优化。本文将深入探讨 SOFAJRaft 的核心源码实现,包括 Leader 选举、日志复制、一致性维护、日志管理和快照机制等。通过关键代码展示其在节点初始化、日志复制、一致性维护等方面的设计思路。希望帮助大家更好地理解 Raft 算法,求关注和点赞,感谢!
613 2
蚂蚁Raft一致性算法库SOFAJRaft深入分析
|
数据库 数据中心 OceanBase
【赵渝强老师】OceanBase租户的资源管理
OceanBase数据库支持多租户架构,通过资源配置(Unit Config)、资源单元(Unit)和资源池(Resource Pool)实现资源隔离与管理。用户可灵活定义资源规格,分配CPU、内存等资源,并通过资源池管理租户资源分配,提升系统资源利用率和管理效率。
353 0
|
机器学习/深度学习 Java 开发工具
【移花接木】OpenCV4.8 For Java 深度学习 实时人脸检测
【移花接木】OpenCV4.8 For Java 深度学习 实时人脸检测
461 0
|
人工智能 安全 Java
深入理解Java浅拷贝与深拷贝
本文深入探讨Java中浅拷贝与深拷贝的概念、实现方式及应用场景。浅拷贝通过`clone()`方法复制对象引用,修改新对象会影响原对象;深拷贝则创建完全独立的新对象,确保数据安全。文章通过代码示例讲解两种拷贝方式的实现,并分析其优缺点。同时,针对List类型提供浅拷贝和深拷贝的具体实现方法,帮助读者更好地理解和应用这两种技术。选择拷贝方式时需权衡对象复杂度、大小及操作安全性等因素。
870 2
|
存储 分布式计算 Java
踏上大数据第一步:flume
Flume 是一个分布式、可靠且高效的系统,用于收集、聚合和移动大量日志数据。它是 Apache 顶级项目,广泛应用于 Hadoop 生态系统中。Flume 支持从多种数据源(如 Web 服务器、应用服务器)收集日志,并将其传输到中央存储(如 HDFS、HBase)。其核心组件包括 Source、Channel 和 Sink,分别负责数据获取、临时存储和最终存储。本文还介绍了在 Ubuntu 20.04 上安装 Flume 1.9.0 的步骤,涵盖 JDK 安装、Flume 下载、解压、配置环境变量及验证安装等详细过程。
558 10