MyBatis核心配置文件详解
MyBatis核心配置文件详解MyBatis 是一款优秀的持久层框架它通过 XML 或注解方式将 Java 对象与 SQL 语句进行映射极大地简化了数据库操作。而 MyBatis 的核心配置文件通常命名为mybatis-config.xml是整个框架的“大脑”它定义了数据源、事务管理、映射文件加载、全局设置等关键信息。本文将从实战角度出发深入解析核心配置文件的各个元素并通过代码示例演示其用法。## 核心配置文件的结构概述MyBatis 核心配置文件是一个 XML 文件其根元素为configuration内部包含多个子元素按顺序排列如下顺序严格不可颠倒configuration├── properties属性├── settings全局设置├── typeAliases类型别名├── typeHandlers类型处理器├── objectFactory对象工厂├── plugins插件├── environments环境配置│ ├── environment单个环境│ │ ├── transactionManager事务管理器│ │ └── dataSource数据源├── databaseIdProvider数据库厂商标识├── mappers映射器下面我们逐一详解每个元素。## 1. properties 元素动态加载外部属性properties元素允许我们在配置文件中使用占位符${}来引用外部属性文件如db.properties或直接在内部定义属性。这有助于实现配置的集中管理和环境切换。### 实战示例加载外部属性文件假设我们有一个db.properties文件propertiesjdbc.drivercom.mysql.cj.jdbc.Driverjdbc.urljdbc:mysql://localhost:3306/mybatis_demo?useSSLfalseserverTimezoneUTCjdbc.usernamerootjdbc.password123456在mybatis-config.xml中引用xml?xml version1.0 encodingUTF-8 ?!DOCTYPE configuration PUBLIC -//mybatis.org//DTD Config 3.0//EN http://mybatis.org/dtd/mybatis-3-config.dtdconfiguration !-- 加载外部属性文件 -- properties resourcedb.properties / environments defaultdevelopment environment iddevelopment transactionManager typeJDBC / dataSource typePOOLED !-- 使用占位符引用属性 -- property namedriver value${jdbc.driver} / property nameurl value${jdbc.url} / property nameusername value${jdbc.username} / property namepassword value${jdbc.password} / /dataSource /environment /environments !-- 其他配置... --/configuration注意如果外部文件和内部定义同时存在外部文件优先级更高。也可以直接使用properties的子元素定义属性但推荐使用外部文件实现环境分离。## 2. settings 元素全局行为调优settings元素是 MyBatis 中最复杂的配置元素它影响框架的全局行为。例如开启驼峰命名映射、设置缓存、配置日志实现等。### 常用 settings 项一览表| 设置项 | 描述 | 有效值 | 默认值 ||--------|------|--------|--------||cacheEnabled| 全局开启或关闭所有映射器中的缓存 | true/false | true ||lazyLoadingEnabled| 延迟加载的全局开关 | true/false | false ||aggressiveLazyLoading| 当开启时任何方法的调用都会加载该对象的所有属性 | true/false | false ||mapUnderscoreToCamelCase| 是否开启自动驼峰命名规则映射 | true/false | false ||logImpl| 指定 MyBatis 所用日志的具体实现 | SLF4J, LOG4J2, STDOUT_LOGGING 等 | 未设置 |### 实战示例配置日志和驼峰映射xmlsettings !-- 开启驼峰命名映射例如数据库列 user_name 自动映射到 userName -- setting namemapUnderscoreToCamelCase valuetrue / !-- 使用标准输出日志控制台打印 SQL -- setting namelogImpl valueSTDOUT_LOGGING / !-- 开启二级缓存 -- setting namecacheEnabled valuetrue / !-- 开启延迟加载 -- setting namelazyLoadingEnabled valuetrue //settings实战建议在开发阶段开启STDOUT_LOGGING方便调试生产环境建议使用 Log4j2 等专业日志框架。## 3. typeAliases 元素简化全限定名typeAliases用于给 Java 类型起一个简短的名字这样在映射文件中就不必写完整的包名类名。MyBatis 内置了一些常用类型的别名如string对应java.lang.String。### 实战示例批量扫描包xmltypeAliases !-- 为单个类指定别名 -- typeAlias typecom.example.model.User aliasUser / !-- 批量扫描包默认别名是类名首字母小写如 user -- package namecom.example.model //typeAliases如果使用了package扫描MyBatis 会自动将com.example.model.User的别名设为user。在映射文件中就可以直接使用xmlselect idfindById resultTypeuser SELECT * FROM user WHERE id #{id}/select## 4. environments 元素多环境配置environments允许我们配置多个数据源环境如开发、测试、生产通过default属性指定当前使用的环境。### 实战示例配置开发和生产两个环境xmlenvironments defaultdevelopment !-- 开发环境 -- environment iddevelopment transactionManager typeJDBC / dataSource typePOOLED property namedriver valuecom.mysql.cj.jdbc.Driver / property nameurl valuejdbc:mysql://localhost:3306/dev_db / property nameusername valuedev_user / property namepassword valuedev_pass / /dataSource /environment !-- 生产环境 -- environment idproduction transactionManager typeJDBC / dataSource typePOOLED property namedriver valuecom.mysql.cj.jdbc.Driver / property nameurl valuejdbc:mysql://prod-server:3306/prod_db / property nameusername valueprod_user / property namepassword valueprod_pass / /dataSource /environment/environments注意当使用 Spring 整合 MyBatis 时通常environments配置会被 Spring 的DataSource替代但独立使用 MyBatis 时这是必要的。## 5. mappers 元素注册映射文件mappers用于告诉 MyBatis 去哪里找 SQL 映射文件XML 或注解方式。这是框架能够识别 SQL 语句的关键。### 实战示例多种注册方式xmlmappers !-- 方式1通过类路径注册单个映射文件 -- mapper resourcecom/example/mapper/UserMapper.xml / !-- 方式2通过完全限定资源 URL -- mapper urlfile:///var/mappers/UserMapper.xml / !-- 方式3通过映射器接口全限定名接口与XML在同一包下且同名 -- mapper classcom.example.mapper.UserMapper / !-- 方式4批量扫描包下的所有接口 -- package namecom.example.mapper //mappers实战建议推荐使用package或class方式代码更简洁且与 Spring 整合时更自然。## 6. 完整可运行示例一个简单的 MyBatis 应用下面是一个完整的mybatis-config.xml配置包含一个简单的查询操作。请注意这里省略了数据库和表的创建过程假设存在user表。### 配置文件mybatis-config.xmlxml?xml version1.0 encodingUTF-8 ?!DOCTYPE configuration PUBLIC -//mybatis.org//DTD Config 3.0//EN http://mybatis.org/dtd/mybatis-3-config.dtdconfiguration !-- 1. 加载外部数据库属性 -- properties resourcedb.properties / !-- 2. 全局设置 -- settings setting namemapUnderscoreToCamelCase valuetrue / setting namelogImpl valueSTDOUT_LOGGING / /settings !-- 3. 类型别名 -- typeAliases package namecom.example.model / /typeAliases !-- 4. 环境配置开发环境 -- environments defaultdevelopment environment iddevelopment transactionManager typeJDBC / dataSource typePOOLED property namedriver value${jdbc.driver} / property nameurl value${jdbc.url} / property nameusername value${jdbc.username} / property namepassword value${jdbc.password} / /dataSource /environment /environments !-- 5. 注册映射器 -- mappers mapper resourcecom/example/mapper/UserMapper.xml / /mappers/configuration### 映射文件UserMapper.xmlxml?xml version1.0 encodingUTF-8 ?!DOCTYPE mapper PUBLIC -//mybatis.org//DTD Mapper 3.0//EN http://mybatis.org/dtd/mybatis-3-mapper.dtdmapper namespacecom.example.mapper.UserMapper !-- 根据ID查询用户 -- select idselectUser resultTypeUser parameterTypeint SELECT id, user_name, email FROM user WHERE id #{id} /select/mapper### Java 入口代码Main.javajavapackage com.example;import com.example.model.User;import org.apache.ibatis.io.Resources;import org.apache.ibatis.session.SqlSession;import org.apache.ibatis.session.SqlSessionFactory;import org.apache.ibatis.session.SqlSessionFactoryBuilder;import java.io.InputStream;public class Main { public static void main(String[] args) throws Exception { // 1. 加载核心配置文件 String resource mybatis-config.xml; InputStream inputStream Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory new SqlSessionFactoryBuilder().build(inputStream); // 2. 获取 SqlSession 实例 try (SqlSession session sqlSessionFactory.openSession()) { // 3. 执行查询通过命名空间ID User user session.selectOne(com.example.mapper.UserMapper.selectUser, 1); System.out.println(查询结果: user); } }}运行说明确保db.properties文件存在且数据库连接正确同时User类、UserMapper.xml路径正确。运行后控制台将打印 SQL 语句和查询结果。## 总结MyBatis 核心配置文件是理解和使用框架的基石。本文从properties、settings、typeAliases、environments和mappers五个核心元素入手结合实战代码演示了如何动态加载属性、配置日志、简化别名、管理多环境以及注册映射文件。掌握这些配置后你可以根据项目需求灵活调整 MyBatis 的行为比如切换数据库环境、开启延迟加载、使用日志框架等。在实际开发中建议将配置与代码分离利用properties实现环境隔离并合理使用settings优化性能。希望这篇文章能帮助你快速上手 MyBatis 核心配置为后续的持久层开发打下坚实基础。

相关新闻

Neon Pageserver Storage Shard 扩容分析

Neon Pageserver Storage Shard 扩容分析

Neon pageserver 的"扩容"通过 Storage Shard 机制实现。这不是传统意义上对单个 pageserver 水平扩展,而是两层扩容策略:1. Tenant Sharding(分片) —将租户数据打散到多个 pageserver 节点上 2. Node Scale-out&#…

2026/10/16 10:04:20 阅读更多 →
Kimi K3 vs Fable 5 最新资讯

Kimi K3 vs Fable 5 最新资讯

最近AI圈两大顶级模型持续上演对标大戏,国产开源代表Kimi K3、海外闭源标杆Fable 5,短短几天接连爆出重磅消息,不管是做开发、AI内容创作、本地部署,还是选择API服务,这些动态直接影响选型。今天把两边最新事件一次性梳…

2026/10/16 0:47:27 阅读更多 →
AI如何学习知识?与人类学习的本质差异

AI如何学习知识?与人类学习的本质差异

如今,AI已深度融入生活,能识字作画、解题编程、对话答疑,看似拥有和人类相似的学习能力。但事实上,AI的“学习”与人类的学习只是表象相似,底层逻辑、认知方式、成长逻辑有着天壤之别。AI的学习是算法驱动的数据拟合&a…

2026/10/16 18:45:05 阅读更多 →

最新新闻

ESP32分区表完全指南:从partitions.csv到OTA与Flash规划

ESP32分区表完全指南:从partitions.csv到OTA与Flash规划

第一次打开ESP32工程目录,看到partitions.csv这个文件时,我压根没当回事,以为就是个自动生成的临时配置。直到有一次编译报错提醒我“app partition is too small”,我才被迫去搞懂它。搞懂之后回头看,分区表几乎决定了…

2026/10/18 7:30:04 阅读更多 →
SQL注入入门:从原理到实战,数字型与字符型详解(2)

SQL注入入门:从原理到实战,数字型与字符型详解(2)

摘要:本文以 SQL 注入为主题,先回顾数字型注入与字符型注入的区别,再重点讲解两个关键探测手段:order by 用于判断查询结果的列数,union 用于把自定义查询结果拼接到原查询后面。文章结合靶场实例,详细演示…

2026/10/18 7:30:04 阅读更多 →
UART串口实战:从寄存器配置到printf重定向的嵌入式调试指南

UART串口实战:从寄存器配置到printf重定向的嵌入式调试指南

1. 从Day1到Day3之后,我为什么决定把第四天留给串口说实话,我前三天是有点浮躁的。Day1搭建开发环境,Day2点亮板载LED,Day3用按键控制灯亮灭。做完这些之后我一度觉得嵌入式好像也就这么回事——配置几个寄存器、写几个while(1)循…

2026/10/18 7:30:04 阅读更多 →
仿muduo实现高并发服务器——读写缓冲区Buffer.hpp

仿muduo实现高并发服务器——读写缓冲区Buffer.hpp

目录摘要注释3.1 回顾3.2 新知识3.3 注意3.4 反思正文4.1 开发中遇到的问题总结常见问题标签摘要 Buffer.hpp 是 header-only 实现:#include 即用,无需链接 .cpp/.a/.so。内部为 std::vector 加 _redidx/_wrtidx 两个下标,提供写入、读取、容…

2026/10/18 7:30:04 阅读更多 →
随身WiFi的adb shell常用命令三十条:系统状态一键体检

随身WiFi的adb shell常用命令三十条:系统状态一键体检

本文是随身WiFi系列第 69 篇,正文约 3200 字,读完约 9 分钟。前面几十篇里散落过各种 adb 命令,评论区一直喊"有没有一个合集"。这篇把最常用的三十条按场景归档:看信号、看流量、看内存、看存储、看日志、救急&#xf…

2026/10/18 7:30:04 阅读更多 →
基于STM32H750与SOEM的EtherCAT主站开发实战解析

基于STM32H750与SOEM的EtherCAT主站开发实战解析

1. 为什么我最终选了"H750SOEM"这套组合做EtherCAT主站开发,绕不开一个问题:用哪颗芯片、跑哪套协议栈。市面上主流的方案分两派,一派走ASIC专用芯片,另一派走"MCU软件协议栈"。我这次选的是后者,…

2026/10/18 7:29:04 阅读更多 →

日新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 0:55:02 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →