开源框架: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 对象,等待批量执行
目录
相关文章
|
29天前
|
存储 弹性计算 安全
我为什么推荐加入 SoloDev 独立开发很酷 - 独立开发者社区和使用阿里云云服务做独立开发
“独立开发很酷”是一个专注服务独立开发者的综合性社区,提供技术交流、产品展示、资源共享与行业资讯平台。汇聚开发者互助成长,助力创新落地,推动个人与团队共同发展,是每位独立开发者的理想家园。
|
1月前
|
存储 弹性计算 人工智能
2026年阿里云服务器专属活动,爆款直降活动内容与云服务器活动价格参考
阿里云推出的弹性计算云服务器爆款直降活动,是云服务器ECS产品专属活动,2026年,这个活动中既有轻量应用服务器38元抢购,也有年度爆款服务器经济型e实例2核2G3M带宽 40G ESSD Entry云盘特惠价99元1年,还有通用算力型u2a实例指定配置2.5折,更强劲、更安全、更划算的第9代计算型c9i、通用型g9i、内存型r9i云服务器年付6.4折起等活动内容。本位为大家介绍爆款直降的最新活动内容,以及活动内云服务器的活动价格,以供参考和选择。
152 3
|
22天前
|
传感器 人工智能 自动驾驶
智能体来了(西南总部)前沿洞察:当AI拥有了“身体”——从“屏幕里的助手”到“行走具身智能”的进化实录
AI正从屏幕走向现实!2026年,具身智能将赋予机器人、家居、城市“生命”,实现感知、决策与行动。智能体不再只是聊天工具,而是能看、听、动的“硅基伙伴”。从家庭到工业,AI将重塑物理世界,开启碳基与硅基文明的深度握手。未来已来,万物皆可智。
179 2
|
1月前
|
存储 缓存 调度
阿里云Tair KVCache仿真分析:高精度的计算和缓存模拟设计与实现
在大模型推理迈向“智能体时代”的今天,KVCache 已从性能优化手段升级为系统级基础设施,“显存内缓存”模式在长上下文、多轮交互等场景下难以为继,而“以存代算”的多级 KVCache 架构虽突破了容量瓶颈,却引入了一个由模型结构、硬件平台、推理引擎与缓存策略等因素交织而成的高维配置空间。如何在满足 SLO(如延迟、吞吐等服务等级目标)的前提下,找到“时延–吞吐–成本”的最优平衡点,成为规模化部署的核心挑战。
506 38
阿里云Tair KVCache仿真分析:高精度的计算和缓存模拟设计与实现
|
25天前
|
弹性计算 安全 Linux
建站教程:使用阿里云服务器安装Z-Blog博客网站流程,新手一键部署指南
本教程详解如何在阿里云99元服务器上通过宝塔面板快速搭建ZBlog博客。基于CentOS 7.9系统,先安装宝塔面板,开放安全组端口,再一键部署Z-BlogPHP,全程图文指导,简单易懂,新手也能轻松完成博客搭建。
199 2
|
8天前
|
存储 自然语言处理 机器人
OpenClaw(Clawdbot)2026年一键部署及QQ官方机器人集成完整教程
2026年OpenClaw(前身为Moltbot、Clawdbot)优化了与QQ的集成适配流程,支持两种主流集成方式——QQ官方机器人集成(适合企业与团队场景)和QQ个人号集成(适合个人日常使用),全程无需复杂代码开发,通过规范化的应用创建、凭证配置、插件安装与联动设置,即可实现两者无缝对接。集成后,用户可在QQ单聊、群聊中直接与OpenClaw交互,完成智能问答、办公文档生成、任务收集汇总、定时提醒推送等核心功能,适配个人办公与轻量团队协作需求。本教程严格遵循官方适配逻辑与实操规范,覆盖前期准备、两种集成方式的全流程配置、功能验证及问题排查,确保操作可落地且信息原汁原味。
765 2
|
28天前
|
存储 数据采集 弹性计算
面向多租户云的 IO 智能诊断:从异常发现到分钟级定位
当 iowait 暴涨、IO 延迟飙升时,你是否还在手忙脚乱翻日志?阿里云 IO 一键诊断基于动态阈值模型与智能采集机制,实现异常秒级感知、现场自动抓取、根因结构化输出,让每一次 IO 波动都有据可查,真正实现从“被动响应”到“主动洞察”的跃迁。
301 58
|
1月前
|
安全 API 数据库
Dify 开源 LLM 应用开发平台企业级 Docker Compose 部署手册
本文为企业级 Dify 生产部署指南,聚焦 Docker Compose 方案,涵盖环境准备、安全安装、双模式部署、前后端配置及加固优化,适用于私有化与生产场景,不涉及 Kubernetes。
966 7
|
20天前
|
存储 缓存 算法
SGLang Hierarchical Sparse Attention 技术深度解析
阿里云 Tair 联合 SGLang 推出分层稀疏化框架,通过“稀疏+分层”协同优化,将 KVCache 从 GPU 显存扩展至 CPU 与远端存储,实现计算与存储效率双突破,为百万级超长上下文推理提供新路径。
|
16天前
|
算法 搜索推荐 Serverless
为什么 ES 的搜索结果只到 10,000?强制“数清楚”的代价有多大
Elasticsearch 7.x后默认返回10,000总数,实为Block-Max WAND算法的性能优化——跳过低分文档块以提升查询速度。强行开启`track_total_hits:true`将禁用该优化,导致CPU飙升、延迟激增。本文深入Lucene底层,解析其原理、陷阱与治理方案。
276 1