开源框架:MyBatis

简介: 本文汇总MyBatis核心知识点,涵盖配置优先级、多环境设置、事务管理、映射关系、分页实现与缓存机制,系统讲解常见属性及执行器原理,助力高效掌握ORM框架应用。

MyBatis 核心知识点汇总

1. 前言

MyBatis 官网 Java-api 地址:https://mybatis.org/mybatis-3/zh/java-api.html

2. 常见配置

如果一个属性不止在一个地方进行配置,MyBatis 将按照以下顺序加载:

  1. 首先读取 properties 元素体内的属性
  2. 然后根据 properties 元素中的 resource 属性读取类路径下属性文件,或根据 url 属性指定的路径读取属性文件,并覆盖之前读取过的同名属性
  3. 最后读取作为方法参数传递的属性,并覆盖之前读取过的同名属性

优先级顺序:方法参数传递的属性 > resource/url 属性中配置 > properties 元素中指定属性

2.1 几个常见配置属性

设置名 描述 有效值 默认值
cacheEnabled 全局性地开启或关闭所有映射器配置文件中已配置的任何缓存 true | false true
lazyLoadingEnabled 延迟加载的全局开关。开启时所有关联对象都会延迟加载,特定关联可通过 fetchType 覆盖 true | false false
useGeneratedKeys 允许 JDBC 支持自动生成主键(需数据库驱动支持),设置为 true 强制使用 true | false false
defaultExecutorType 配置默认执行器:- SIMPLE:普通执行器- REUSE:重用预处理语句- BATCH:重用语句 + 批量更新 SIMPLE、REUSE、BATCH SIMPLE
localCacheScope 本地缓存作用域:- SESSION:缓存会话中所有查询- STATEMENT:仅缓存当前语句 SESSION、STATEMENT SESSION
proxyFactory 指定延迟加载对象的代理工具 CGLIB | JAVASSIST JAVASSIST(3.3 以上版本)

2.2 多环境配置

多个数据源需创建多个 SqlSessionFactory,每个对应一个数据库。指定环境的方式:

  • SqlSessionFactoryBuilder 传递环境参数
  • 忽略环境参数则加载默认环境

environments 元素配置规则:

  • 默认环境 ID:通过 default 属性指定(如 default="development"
  • 环境 ID:每个 environment 元素的 id 属性(如 id="development"
  • 事务管理器配置:type 属性(如 type="JDBC"
  • 数据源配置:type 属性(如 type="POOLED"

注意:环境名称可自定义,但默认环境 ID 必须匹配某个环境 ID。

2.3 事务管理

2.3.1 JDBC 事务管理

直接使用 JDBC 的提交 / 回滚机制,依赖数据源连接管理事务作用域。

2.3.2 MANAGED 事务管理

不主动提交 / 回滚连接,由容器(如 JEE 应用服务器)管理事务生命周期:

  • 默认会关闭连接
  • 若容器不希望关闭连接,需设置 closeConnection="false"

注意:Spring + MyBatis 集成时,无需配置事务管理器,Spring 会用自带管理器覆盖默认配置。两种事务管理器均无需额外设置属性。

3. XML (mapper) 关联映射

3.1 一对一映射

  • 定义一对一 ResultMap,实现属性与字段的关联映射
  • 若属性与字段名一致(含驼峰命名匹配,如 id 对应 USER_ID),可直接使用 resultType
  • resultMap 主要用于解决字段与属性名不一致的场景

3.2 一对多映射(例:一个用户对应多个角色)

  1. User 类中添加 List<Role> 属性
  2. 在用户 mapper.xml 的 resultMap 中添加 <collection> 标签

3.3 多对一映射(例:多个博客对应一个作者)

  1. Blog 类中添加 Author 属性
  2. 在博客 mapper.xml 的 resultMap 中添加 <association> 标签

3.4 多对多映射(例:多个部门对应多个用户)

  1. 定义中间类(如 UserForDept.java),包含属性 private User user; private Dept dept;
  2. User 类中添加 Set<Dept>(或 List<Dept>),其 mapper.xml 中通过 <collection> 关联 UserForDept
  3. Dept 类中添加 Set<User>(或 List<User>),其 mapper.xml 中通过 <collection> 关联 UserForDept

4. 分页实现

4.1 自带 RowBounds 分页

  • 先查询全部结果集(ResultSet),再在内存中进行分页(limit)
  • 属于逻辑分页

4.2 第三方插件 PageHelper

将查询 SQL 拆分为两步执行:

  1. 自动识别数据库类型,添加对应分页关键字(MySQL→limit、Oracle→rownum、DB2→fetch),查询分页结果
  2. 执行 count 语句,查询结果总条数

4.3 SQL 原生分页

依赖数据库原生语法实现,如 limit(MySQL)、rownum(Oracle)等。

4.4 数组分页

  1. DAO 层:定义查询全部数据的接口方法(如 List<Student> selectAll()
  2. Mapper.xml:编写查询全部数据的 SQL(无分页逻辑)
  3. Service 层:
  • 定义分页方法(接收 currPage 页码、pageSize 每页条数)
  • 通过 List.subList() 截取指定范围的数据
  1. Controller 层:接收前端参数,调用 Service 分页方法

4.5 拦截器分页

  • 自定义拦截器,拦截指定规则的查询语句(如以 ByPage 结尾的方法)
  • 统一在 SQL 后拼接分页语句(如 limit),实现分页逻辑

4.6 分页总结

分页类型 特点 适用场景
逻辑分页(RowBounds) 内存开销大,小数据量效率高 数据量小的场景
物理分页(PageHelper、SQL、数组、拦截器) 小数据量效率略低,无内存溢出风险 大数据量场景(推荐)

优先级:物理分页 > 逻辑分页

5. 缓存

  • 5.1 一级缓存
  • 5.2 二级缓存

6. 执行器

6.1 SimpleExecutor

  • 每执行一次 update/select,创建一个 Statement 对象
  • 执行完成后立即关闭 Statement

6.2 ReuseExecutor

  • 以 SQL 为 key 缓存 Statement 对象
  • 存在则复用,不存在则创建
  • 执行完成后不关闭,存入 Map 供下次使用

6.3 BatchExecutor

  • 仅支持 update 操作(JDBC 批处理不支持 select)
  • 将所有 SQL 加入批处理(addBatch ())
  • 统一执行批处理操作(executeBatch ())
  • 缓存多个 Statement 对象,等待批量执行
相关文章
|
4天前
|
存储 JavaScript 前端开发
JavaScript基础
本节讲解JavaScript基础核心知识:涵盖值类型与引用类型区别、typeof检测类型及局限性、===与==差异及应用场景、内置函数与对象、原型链五规则、属性查找机制、instanceof原理,以及this指向和箭头函数中this的绑定时机。重点突出类型判断、原型继承与this机制,助力深入理解JS面向对象机制。(238字)
|
3天前
|
云安全 人工智能 安全
阿里云2026云上安全健康体检正式开启
新年启程,来为云上环境做一次“深度体检”
1538 6
|
5天前
|
安全 数据可视化 网络安全
安全无小事|阿里云先知众测,为企业筑牢防线
专为企业打造的漏洞信息收集平台
1321 2
|
5天前
|
缓存 算法 关系型数据库
深入浅出分布式 ID 生成方案:从原理到业界主流实现
本文深入探讨分布式ID的生成原理与主流解决方案,解析百度UidGenerator、滴滴TinyID及美团Leaf的核心设计,涵盖Snowflake算法、号段模式与双Buffer优化,助你掌握高并发下全局唯一ID的实现精髓。
337 160
|
5天前
|
人工智能 自然语言处理 API
n8n:流程自动化、智能化利器
流程自动化助你在重复的业务流程中节省时间,可通过自然语言直接创建工作流啦。
394 6
n8n:流程自动化、智能化利器
|
7天前
|
人工智能 API 开发工具
Skills比MCP更重要?更省钱的多!Python大佬这观点老金测了一周终于懂了
加我进AI学习群,公众号右下角“联系方式”。文末有老金开源知识库·全免费。本文详解Claude Skills为何比MCP更轻量高效:极简配置、按需加载、省90% token,适合多数场景。MCP仍适用于复杂集成,但日常任务首选Skills。推荐先用SKILL.md解决,再考虑协议。附实测对比与配置建议,助你提升效率,节省精力。关注老金,一起玩转AI工具。
|
13天前
|
机器学习/深度学习 安全 API
MAI-UI 开源:通用 GUI 智能体基座登顶 SOTA!
MAI-UI是通义实验室推出的全尺寸GUI智能体基座模型,原生集成用户交互、MCP工具调用与端云协同能力。支持跨App操作、模糊语义理解与主动提问澄清,通过大规模在线强化学习实现复杂任务自动化,在出行、办公等高频场景中表现卓越,已登顶ScreenSpot-Pro、MobileWorld等多项SOTA评测。
1518 7
|
3天前
|
Linux 数据库
Linux 环境 Polardb-X 数据库 单机版 rpm 包 安装教程
本文介绍在CentOS 7.9环境下安装PolarDB-X单机版数据库的完整流程,涵盖系统环境准备、本地Yum源配置、RPM包安装、用户与目录初始化、依赖库解决、数据库启动及客户端连接等步骤,助您快速部署运行PolarDB-X。
240 1
Linux 环境 Polardb-X 数据库 单机版 rpm 包 安装教程
|
8天前
|
人工智能 前端开发 API
Google发布50页AI Agent白皮书,老金帮你提炼10个核心要点
老金分享Google最新AI Agent指南:让AI从“动嘴”到“动手”。Agent=大脑(模型)+手(工具)+协调系统,可自主完成任务。通过ReAct模式、多Agent协作与RAG等技术,实现真正自动化。入门推荐LangChain,文末附开源知识库链接。
661 119