开源框架: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 对象,等待批量执行
目录
相关文章
|
3月前
|
算法 搜索推荐 Serverless
为什么 ES 的搜索结果只到 10,000?强制“数清楚”的代价有多大
Elasticsearch 7.x后默认返回10,000总数,实为Block-Max WAND算法的性能优化——跳过低分文档块以提升查询速度。强行开启`track_total_hits:true`将禁用该优化,导致CPU飙升、延迟激增。本文深入Lucene底层,解析其原理、陷阱与治理方案。
474 1
|
3月前
|
NoSQL Linux 网络安全
开源框架:MongoDB—单机部署
本文介绍MongoDB在Windows和Linux系统的部署与启动方法,涵盖环境要求、安装包下载、目录配置、命令行及配置文件启动方式,并说明Shell连接、图形化工具Compass的使用,以及Linux下的防火墙设置与安全关闭服务步骤,提供常用命令与注意事项。
181 1
|
3月前
|
人工智能 前端开发 测试技术
二十年,重新出发!第 20 届 D2 技术大会「AI 新」议题全球征集正式开启
D2技术大会迎来第20届,以“AI 新”为主题,聚焦AI重构终端技术的全新范式。涵盖AI Coding、交互体验、框架演进、智能测试等七大专场,邀请全球开发者分享前沿实践。顶尖出品人护航,共探AI时代的技术跃迁与个体放大。提交议题,共启未来!
|
5月前
|
人工智能 IDE 数据挖掘
Python安装 + 使用教程
本文介绍了Python的起源、应用领域及Windows系统下的安装与配置方法。涵盖办公自动化、数据分析、人工智能等实用场景,并详细演示下载、安装、环境变量设置及常见问题解决,帮助初学者快速上手Python编程。
1453 3
|
3月前
|
Java 数据库连接 数据库
MyBatis的常见配置
在mybatis配置过程中的部分总结
124 0
|
4月前
|
SQL Java 数据库连接
MyBatis升级版:MyBatisPlus
MyBatisPlus是MyBatis的增强工具,简化单表CRUD操作,无需编写XML即可实现增删改查。通过继承BaseMapper、使用条件构造器(如QueryWrapper)、Service接口及分页插件,大幅提升开发效率。支持自定义SQL、逻辑删除、枚举与JSON处理,并提供代码生成器和通用分页封装,广泛应用于企业级项目中。
|
SQL NoSQL 数据可视化
你的mongodb客户端是哪个呢?
MongoDB 是一种流行的文档数据库,支持多种应用场景。常用的客户端管理工具包括: 1. **MongoDB Shell**:现代命令行界面,提供语法高亮、自动完成等功能。 2. **MongoDB Compass**:图形化界面,支持可视化查询、聚合框架、多平台运行和实时性能监控。 3. **Studio 3T**:企业级工具,支持SQL查询、代码生成、数据导入导出和高级安全功能。
3905 14
|
运维 Serverless API
四大软件架构:掌握单体、分布式、微服务、Serverless 的精髓
如果一个软件开发人员,不了解软件架构的演进,会制约技术的选型和开发人员的生存、晋升空间。这里我列举了目前主要的四种软件架构以及他们的优缺点,希望能够帮助软件开发人员拓展知识面。
|
网络协议 API 数据格式
HTTP 和 TCP 协议的主要区别
【10月更文挑战第25天】HTTP 和 TCP 在网络通信中扮演着不同的角色,各自具有独特的功能和特点,它们相互配合,共同为实现网络应用的各种需求提供了基础支持。
|
存储 NoSQL 关系型数据库
可以存储文件的数据库有哪些?
可以存储文件的数据库有哪些?
1706 6