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 的配置。


相关文章
|
Java API Spring
SpringBoot项目调用HTTP接口5种方式你了解多少?
SpringBoot项目调用HTTP接口5种方式你了解多少?
3164 2
|
缓存 负载均衡 前端开发
Nginx极简入门(九)Nginx实现动静分离!
前面介绍了Nginx的负载均衡,一般来说,都需要将动态资源和静态资源分开,这样可以很大程度的提升静态资源的访问速度,同时在开过程中也可以让前后端开发并行可以有效的提高开发时间,也可以有些的减少联调时间 。接下来介绍什么是动静分离以及如何使用Nginx实现动静分离。
Nginx极简入门(九)Nginx实现动静分离!
SpringMVC+Mybatis两个数据源实现(一)
SpringMVC+Mybatis两个数据源实现(一)
330 0
|
7天前
|
SQL Java 数据库连接
SpringBoot整合MyBatis-Flex保姆级教程,看完就能上手!
MyBatis-Flex 作为一个现代化的 MyBatis 增强框架,在保持 MyBatis 灵活性的同时,提供了更多便捷的功能,特别适合需要复杂查询和高性能要求的项目。
133 0
|
存储 运维 算法
蚂蚁Raft一致性算法库SOFAJRaft深入分析
大家好,我是 V 哥。SOFAJRaft 是蚂蚁金服开源的一款基于 Raft 共识算法的 Java 实现,特别适合高负载、低延迟的分布式系统。它支持 Multi-Raft-Group,能同时处理多个 Raft 集群,具备扩展性和强一致性保障。项目源自百度的 braft,并在性能和功能上进行了优化。本文将深入探讨 SOFAJRaft 的核心源码实现,包括 Leader 选举、日志复制、一致性维护、日志管理和快照机制等。通过关键代码展示其在节点初始化、日志复制、一致性维护等方面的设计思路。希望帮助大家更好地理解 Raft 算法,求关注和点赞,感谢!
479 2
蚂蚁Raft一致性算法库SOFAJRaft深入分析
|
存储 分布式计算 Java
踏上大数据第一步:flume
Flume 是一个分布式、可靠且高效的系统,用于收集、聚合和移动大量日志数据。它是 Apache 顶级项目,广泛应用于 Hadoop 生态系统中。Flume 支持从多种数据源(如 Web 服务器、应用服务器)收集日志,并将其传输到中央存储(如 HDFS、HBase)。其核心组件包括 Source、Channel 和 Sink,分别负责数据获取、临时存储和最终存储。本文还介绍了在 Ubuntu 20.04 上安装 Flume 1.9.0 的步骤,涵盖 JDK 安装、Flume 下载、解压、配置环境变量及验证安装等详细过程。
405 10
|
人工智能 安全 Java
深入理解Java浅拷贝与深拷贝
本文深入探讨Java中浅拷贝与深拷贝的概念、实现方式及应用场景。浅拷贝通过`clone()`方法复制对象引用,修改新对象会影响原对象;深拷贝则创建完全独立的新对象,确保数据安全。文章通过代码示例讲解两种拷贝方式的实现,并分析其优缺点。同时,针对List类型提供浅拷贝和深拷贝的具体实现方法,帮助读者更好地理解和应用这两种技术。选择拷贝方式时需权衡对象复杂度、大小及操作安全性等因素。
747 2
|
机器学习/深度学习 Java 开发工具
【移花接木】OpenCV4.8 For Java 深度学习 实时人脸检测
【移花接木】OpenCV4.8 For Java 深度学习 实时人脸检测
375 0
|
Java API 开发者
【面试题精讲】SPI 和 API 有什么区别?
【面试题精讲】SPI 和 API 有什么区别?

热门文章

最新文章

下一篇
开通oss服务