深入解析:MyBatis 核心知识体系整理 【面试专题】

news/2025/11/11 8:34:53/文章来源:https://www.cnblogs.com/ljbguanli/p/19208857

深入解析:MyBatis 核心知识体系整理 【面试专题】

一、MyBatis 简介与工作原理

1. 基本情况:ORM 框架

  • MyBatis 是一个优秀的 半自动 ORM(对象关系映射)框架
  • 它将 Java 对象与数据库记录进行映射,支持自定义 SQL、存储过程以及高级映射。
  • 相比于 Hibernate 的全自动 ORM,MyBatis 更加灵活,允许开发者直接编写 SQL,适用于复杂查询和性能调优场景。

2. 工作原理

(1)框架初始化流程

系统启动时,MyBatis 加载并解析以下两个核心文件:

  • 全局配置文件 mybatis-config.xml
  • Mapper 映射文件(XML 或注解)

所有解析结果最终封装到一个核心对象:Configuration 中。

@Test
public void test1() throws Exception {// 1. 加载配置文件InputStream in = Resources.getResourceAsStream("mybatis-config.xml");// 2. 使用 SqlSessionFactoryBuilder 构建 SqlSessionFactory(建造者模式)SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);// 3. 获取 SqlSession(会话对象)SqlSession sqlSession = factory.openSession();// 4. 执行数据库操作List list = sqlSession.selectList("com.boge.mapper.UserMapper.selectUserList");// 或通过代理方式调用接口// UserMapper mapper = sqlSession.getMapper(UserMapper.class);System.out.println("list.size() = " + list.size());// 5. 关闭会话sqlSession.close();
}
(2)关键组件说明
组件作用
SqlSessionFactoryBuilder使用建造者模式,解析配置文件并创建 SqlSessionFactory
SqlSessionFactory工厂类,用于创建 SqlSession,应设计为单例
SqlSession代表一次数据库会话,提供增删改查 API,线程不安全,需按需创建和关闭
Configuration存储全局配置信息、映射信息、类型处理器等,是 MyBatis 的“大脑”
(3)处理 SQL 请求流程
  1. 调用 SqlSession.selectList() 等方法
  2. 根据命名空间 + ID 找到对应的 MappedStatement
  3. 创建 Executor 执行器(支持缓存装饰)
  4. 先查二级缓存 → 再查一级缓存 → 若无命中则访问数据库
  5. 将结果映射为 Java 对象返回

二、MyBatis 缓存机制设计

1. 缓存的作用

  • 减少对数据库的访问频率
  • 提高响应速度和系统吞吐量

2. 缓存架构设计:装饰器模式

MyBatis 使用 装饰器模式(Decorator Pattern) 实现缓存功能扩展,如:

  • CachingExecutor 装饰普通 Executor,实现二级缓存功能

3. 一级缓存 vs 二级缓存

特性一级缓存(Local Cache)二级缓存(Global Cache)
作用域SqlSession 级别SqlSessionFactory 级别
默认开启否(需手动配置 <cache/>
生命周期与 SqlSession 一致跨 SqlSession 共享
数据一致性高(同一线程内)需注意并发更新问题
查找顺序第二步查找第一步查找

为什么先查二级缓存?

因为二级缓存作用范围更大(跨会话),命中率更高(90%),而一级缓存仅限当前会话(5%)。因此优先使用二级缓存提升整体性能。

4. 缓存开关控制

  • 一级缓存:可通过 localCacheScope 配置(SESSION / STATEMENT
  • 二级缓存:在 Mapper XML 中添加 <cache /> 标签启用

三、MyBatis 缓存扩展机制

1. 自定义缓存实现

实现 org.apache.ibatis.cache.Cache 接口:

public class MyCustomCache implements Cache {private String id;public MyCustomCache(String id) {this.id = id;}@Overridepublic String getId() {return id;}@Overridepublic void putObject(Object key, Object value) {// 自定义存储逻辑(如 Redis)}@Overridepublic Object getObject(Object key) {// 自定义获取逻辑return null;}@Overridepublic Object removeObject(Object key) { ... }@Overridepublic void clear() { ... }@Overridepublic int getSize() { ... }
}

2. 在 Mapper 中引用自定义缓存

可结合 Redis、Ehcache 等第三方缓存中间件实现分布式缓存。


四、MyBatis 中的设计模式

模块设计模式说明
SqlSessionFactoryBuilder建造者模式构建复杂的 SqlSessionFactory 对象
SqlSessionFactory工厂模式生产 SqlSession 实例
缓存模块装饰器模式CachingExecutor 包装 Executor 实现缓存
日志模块适配器模式 + 代理模式统一不同日志框架接口(Log4j、SLF4J 等)
Mapper 接口动态代理模式MapperProxy 拦截接口调用,转发给 SqlSession
反射模块工厂模式 + 装饰器模式ReflectorMetaObject 封装反射操作
插件机制责任链 + 动态代理拦截四大核心对象的方法

五、SqlSessionFactory 深入理解

  • 是 MyBatis 的核心工厂类,负责创建 SqlSession
  • 应在应用生命周期中保持单例
  • 创建过程由 SqlSessionFactoryBuilder 完成,同时完成:
    • 解析 mybatis-config.xml
    • 加载所有 Mapper 映射文件
    • 构建 Configuration 对象
  • 涉及设计模式:
    • 建造者模式(构建复杂对象)
    • 工厂模式(生产 SqlSession)

六、SqlSession 深入理解

  • 表示一次数据库会话,是 MyBatis 提供的主要 API 入口
  • 提供如下操作方式:
    1. 直接调用 API:selectList()insert()update()delete()
    2. 获取 Mapper 代理对象:sqlSession.getMapper(UserMapper.class)
  • 非线程安全,每个线程应持有独立的 SqlSession 实例
  • 使用完毕后必须调用 close() 方法释放资源,并清空一级缓存

七、对 MyBatis 的整体理解

MyBatis 是目前 Java 开发中最主流的持久层框架之一,具备以下优势:

  • ✅ 支持灵活的 SQL 编写,适合复杂业务场景
  • ✅ 提供强大的动态 SQL 功能(<if><foreach><where> 等标签)
  • ✅ 支持一级/二级缓存、延迟加载、插件扩展
  • ✅ 易于与 Spring/Spring Boot 整合
  • ✅ 相比 Hibernate 更轻量、可控性强

定位:半自动 ORM 框架 —— 开发者写 SQL,MyBatis 做映射。


八、分页实现原理

1. 分页必要性

  • 数据量大时避免一次性加载过多数据
  • 减少内存消耗,提高用户体验

2. MyBatis 分页实现方式

类型方式原理
逻辑分页RowBounds内存中分页,先查全部再截取,效率低
物理分页拦截器(Interceptor)修改 SQL 添加 LIMIT / ROWNUM,推荐方式

推荐使用 PageHelper 插件实现物理分页。


九、Spring 如何解决 DefaultSqlSession 线程安全问题?

  • DefaultSqlSession 是线程非安全的,不能作为成员变量使用
  • Spring 使用 SqlSessionTemplate 作为代理:
    • 内部通过 SqlSessionInterceptor 创建动态代理
    • 每次方法调用都绑定当前线程的 SqlSession(基于 ThreadLocal
    • 实现了线程隔离和自动管理生命周期

SqlSessionTemplate 是线程安全的,可作为 Spring Bean 注入使用


十、延迟加载(Lazy Loading)

1. 场景

  • 多表关联查询时,某些关联数据不需要立即加载
  • 示例:查询用户时不立即加载其部门信息

2. 开启条件


3. 映射配置


4. 原理

  • 返回的是目标对象的代理对象(如 Javassist 或 CGLIB)
  • 当访问关联属性时,触发 SQL 查询加载数据

十一、插件机制原理

1. 可拦截的四大对象

  • Executor(执行器)
  • StatementHandler(语句处理器)
  • ParameterHandler(参数处理器)
  • ResultSetHandler(结果集处理器)

2. 自定义插件步骤

@Intercepts({@Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class})
})
public class MyPlugin implements Interceptor {@Overridepublic Object intercept(Invocation invocation) throws Throwable {// 前置处理Object result = invocation.proceed(); // 执行原方法// 后置处理return result;}
}

注册插件:


3. 应用场景

  • SQL 审计(如禁止 SELECT *
  • 分页、分库分表
  • 参数加密/脱敏
  • 性能监控

十二、Mapper 接口调用要求

使用 Mapper 接口本质是 JDK 动态代理,需满足以下规则:

要求说明
namespace必须等于 Mapper 接口的全限定类名
方法名必须与 XML 中 <select><insert> 等标签的 id 一致
参数类型方法参数类型必须与 parameterType 匹配
返回类型方法返回类型必须与 resultType 或 resultMap 对应
文件命名Mapper 接口名与 XML 文件名应一致(建议)

十三、获取自增主键

适用于插入后需要获取 ID 的场景(如主子表关联插入):

INSERT INTO user(name, age) VALUES(#{name}, #{age})

Java 调用:

User user = new User("张三", 25);
userMapper.insert(user);
System.out.println("自增主键:" + user.getId()); // ID 已自动回填

十四、不同 Mapper 中的 ID 是否可以重复?

可以重复!

  • 因为 MyBatis 通过 namespace + id 唯一标识一条 SQL
  • 示例:
    • com.boge.mapper.UserMapper.selectList
    • com.boge.mapper.RoleMapper.selectList

只要 namespace 不同,SQL ID 可以相同。


十五、MyBatis 架构设计理解

MyBatis 架构分为三层:

层级组成模块功能
接口层SqlSessionMapper Proxy提供开发者使用的 API
核心处理层ExecutorStatementHandlerParameterHandlerResultSetHandlerSQL 执行、参数处理、结果映射
基础支撑层TypeHandlerReflectorLogDataSourceTransactionCache支持核心功能的底层模块

十六、传统 JDBC 的不足与 MyBatis 的解决方案

问题JDBC 不足MyBatis 解决方案
连接管理频繁创建/释放连接支持连接池(PooledDataSource)
SQL 维护SQL 写在代码中,难以维护SQL 与代码分离(XML/注解)
参数传递占位符与参数易错自动映射(#{}
结果映射手动 set/get 属性自动映射到 Java Bean
事务/缓存无内置支持提供事务管理和缓存机制

十七、MyBatis 编程步骤

  1. 构建 SqlSessionFactory(通过 SqlSessionFactoryBuilder
  2. 获取 SqlSession 实例
  3. 执行 SQL 操作(API 或 Mapper 代理)
  4. 提交事务(DML 操作)
  5. 关闭 SqlSession

十八、实体属性与字段不一致怎么办?

解决方案:

  1. 别名法:在 SQL 中使用 AS 给字段起别名
    SELECT user_name AS userName FROM user
  2. ResultMap 映射:定义 <resultMap> 显式指定映射关系
    
    

十九、Executor 执行器类型

类型说明
SIMPLE(默认)每次创建新的 Statement
REUSE缓存 Statement,重复使用
BATCH批量处理,适用于大量插入/更新

二十、如何设置 Executor 类型?

  1. 在 openSession() 时指定:
    sqlSessionFactory.openSession(ExecutorType.BATCH);
  2. 在 mybatis-config.xml 中设置默认类型:
    
    

二十一、MyBatis 多参数传递方式

方式示例推荐度
顺序传参#{0}#{1}❌ 不推荐(易错)
@Param 注解@Param("name") String name✅ 强烈推荐
Map 传参Map<String, Object>✅ 推荐(灵活)
POJO 对象User user✅ 推荐(语义清晰)

二十二、日志模块设计

  • 使用 适配器模式 统一多种日志框架(Log4j、SLF4J、JDK Logging 等)
  • 可在配置文件中指定日志实现:
    
    
  • JDBC 操作日志通过代理实现(见下条)

二十三、SQL 执行日志记录原理

通过动态代理包装 JDBC 核心对象:

  • ConnectionLogger → 日志代理 Connection
  • PreparedStatementLogger → 日志代理 PreparedStatement
  • ResultSetLogger → 日志代理 ResultSet

代理对象在执行前后打印 SQL 和参数信息。


二十四、数据源模块设计

MyBatis 自带两种数据源实现:

  • UnpooledDataSource:非连接池,每次新建连接
  • PooledDataSource:带连接池,提升性能

连接池管理策略:

  • 获取连接:优先空闲队列,超限则等待或抛异常
  • 释放连接:未超限则归还池中,否则关闭物理连接

二十五、事务模块设计

1. 事务特性(ACID)

  • 原子性、一致性、隔离性、持久性

2. 事务管理器类型

类型说明
JDBC使用 JDBC 原生事务(commitrollback
MANAGED交由容器管理(如 Spring)

配置方式:

DML 操作需显式提交:

sqlSession.commit();

二十六、Mapper 接口设计理解

  • Mapper 接口本质是 动态代理模式
  • getMapper() 返回 MapperProxy 实例
  • 调用接口方法时,实际委托给 SqlSession 执行对应 SQL
  • 优势:类型安全、代码简洁、易于维护

二十七、Reflector 模块理解

  • 封装 Java 反射操作(getter/setter、字段、构造器等)
  • 提供 MetaObject 工具类简化反射调用
  • 提升性能:缓存类的元信息(避免重复反射)
  • 可独立使用于其他需要反射的场景

二十八、类型转换模块(TypeHandler)

作用:实现 Java 类型 ↔ JDBC 类型 的转换

结构:

TypeHandler
└── BaseTypeHandler├── IntegerTypeHandler├── StringTypeHandler└── 自定义 TypeHandler

应用场景:

  • 枚举类型转换
  • JSON 字段映射
  • 时间格式化等

二十九、MyBatis 与 Spring 整合

1. 整合方式

  • Spring + MyBatis:使用 SqlSessionFactoryBean 配置
  • Spring Boot:引入 mybatis-spring-boot-starter,自动配置

2. 核心类:MybatisSqlSessionFactoryBean

  • 实现 FactoryBean<SqlSessionFactory>
  • 在 Spring 容器启动时完成 MyBatis 初始化
  • 支持注入数据源、配置文件路径等

三十、总结:对 MyBatis 的理解

MyBatis 是一个轻量级、灵活、高效的半自动 ORM 框架。

它通过 XML 或注解方式将 SQL 与 Java 代码解耦,提供强大的动态 SQL、缓存、延迟加载、插件扩展等功能。其架构清晰,模块解耦,易于集成和扩展,广泛应用于企业级 Java 项目中。


核心优势:

  • 灵活控制 SQL,适合复杂业务
  • 易于调试和优化
  • 与 Spring 生态无缝整合
  • 扩展性强(插件、缓存、日志等)

适用场景:

  • 对 SQL 性能要求高的系统
  • 需要精细控制 SQL 的项目
  • 复杂报表、多表关联查询

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/961987.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025年创业卫生纸加工设备品牌

2025年卫生纸加工创业首选:优创纸品机械引领行业新未来在2025年这个充满机遇与挑战的时代,卫生纸加工行业依然保持着强劲的发展势头。对于准备投身卫生纸加工行业的创业者来说,选择一家可靠的设备供应商至关重要。今…

蓝牙基础(六):蓝牙传输层 HCI 工作原理

liwen01 2025.10.03 前言 在《蓝牙基础(二):蓝牙核心系统架构》中,我们有介绍到蓝牙分层架构设计的核心是:Host(主机)、Controller(控制器)与 HCI(Host Controller Interface,主机控制器接口)。 它们之间的关…

2025年直流电机源头厂家口碑排行榜单

2025年直流电机源头厂家口碑排行榜单前言随着工业自动化水平的不断提升,直流电机作为核心动力设备,在制造业、机器人、医疗器械等领域发挥着重要作用。2025年,直流电机市场呈现出技术升级、品质提升的发展趋势。本文…

2025年应急救援无人机培训报名点排行

2025年应急救援无人机培训报名点权威排行行业背景随着无人机技术在应急救援领域的广泛应用,专业无人机操控人才需求持续增长。2025年,应急救援无人机培训市场迎来新一轮发展机遇。报名点综合排行🥇 金牌推荐:乌鲁…

2025年热门的玉米磨面机TOP实力厂家推荐榜

2025年热门的玉米磨面机TOP实力厂家推荐榜行业背景与市场趋势随着全球粮食加工行业的持续发展,玉米作为重要的粮食作物之一,其加工设备市场需求呈现稳定增长态势。据《2024-2029年全球粮食加工机械市场分析报告》显示…

2025年热门的复合陶瓷衬板热门厂家推荐榜单

2025年热门的复合陶瓷衬板热门厂家推荐榜单行业背景与市场趋势复合陶瓷衬板作为新一代高性能材料,近年来在建筑装饰、机械电气、生态环保等领域展现出强劲的市场需求。根据《2024-2029年中国特种陶瓷行业市场调研与投…

2025年口碑好的氧化铝耐磨陶瓷衬板厂家最新TOP排行榜

2025年口碑好的氧化铝耐磨陶瓷衬板厂家最新TOP排行榜行业背景与市场趋势氧化铝耐磨陶瓷衬板作为工业领域重要的耐磨材料,近年来随着我国制造业转型升级和环保要求提升,市场需求持续增长。根据中国陶瓷工业协会最新数…

暗黑2重制版(Diablo II Resurrected)——MOD自己搞掂不求人 - dark

对于初次接触MOD的朋友,可能被网络上各位玩家制作的MOD搞得很头晕,不知选哪个的好?我这里给朋友们提供一点我的建议,同时这也是我搞的这个MOD的基础。 一个暗黑2的MOD,我以为应该以大箱子、大背包为基础,其他的组…

2025年热门的压延微晶铸石板厂家推荐及选购参考榜

2025年热门的压延微晶铸石板厂家推荐及选购参考榜行业背景与市场趋势压延微晶铸石板作为一种高性能新型材料,近年来在建筑装饰、机械电气、生态环保等领域展现出强劲的市场需求。根据中国建筑材料联合会最新发布的《2…

2025年质量好的煤仓铸石板用户口碑最好的厂家榜

2025年质量好的煤仓铸石板用户口碑最好的厂家榜行业背景与市场趋势随着我国煤炭工业的持续发展和环保要求的不断提高,煤仓铸石板作为重要的耐磨防腐材料,市场需求呈现稳定增长态势。据中国建材工业协会最新数据显示,…

2025年比较好的舒适记忆棉枕厂家最新实力排行

2025年比较好的舒适记忆棉枕厂家最新实力排行行业背景与市场趋势随着消费者对睡眠质量要求的不断提高,记忆棉枕市场近年来呈现稳定增长态势。据中国睡眠研究会2024年发布的《中国睡眠科技产品白皮书》显示,2023年中国…

天气查询

1.新建线程组 http请求 以及查看结果树 2.打开万维易源,打开天气查询,复制网址route.showapi.com,选择get,路径/9-2 3.添加参数appKey 复制万维易源网站密钥,再添加参数area 填写所要查询的城市 4.保存后运行

2025年评价高的铝质仿真茅草服务口碑推荐榜

2025年铝质仿真茅草服务口碑推荐榜:望月亭领跑行业随着建筑装饰行业的不断发展,铝质仿真茅草凭借其优异的性能和逼真的视觉效果,已成为高端度假村、别墅、景区建筑的首选材料。在众多品牌中,望月亭以其卓越的产品质…

2025年口碑好的护颈记忆棉枕用户好评厂家排行

2025年口碑好的护颈记忆棉枕用户好评厂家排行行业背景与市场趋势随着现代人工作生活节奏加快,颈椎问题已成为困扰都市人群的普遍健康隐患。根据中国睡眠研究会最新发布的《2025年中国睡眠健康白皮书》显示,我国成年人…

2025年权威的人造茅草渠道排行榜

2025年人造茅草行业权威渠道排行榜随着人造茅草在景观建筑领域的广泛应用,各大厂商纷纷推出各具特色的产品。根据市场调研和用户反馈,我们为您带来2025年人造茅草渠道权威排行榜。行业领军品牌推荐🥇 宿迁望月亭景…

SRE 第二次作业

通配符、管道、重定向 通配符 文件通配符可以用来匹配符合条件的多个文件名称,方便批量管理文件,通配符采用特定的符号,表示特定的含义,此特定符号称为元meta字符 常见的通配符元字符 含义~ 当前用户家目录路径~用…

2025年口碑好的美颜凝胶枕厂家选购指南与推荐

2025年口碑好的美颜凝胶枕厂家选购指南与推荐行业背景与市场趋势随着消费者对睡眠质量和美容需求的日益增长,美颜凝胶枕市场迎来了快速发展期。根据中国睡眠研究会最新发布的《2024-2025中国睡眠健康产业白皮书》显示…

Jenkins CVE-2018-1000600漏洞验证与SSRF攻击分析

本文详细分析了Jenkins GitHub插件中的CVE-2018-1000600漏洞,介绍了该漏洞的PoC利用方式,包括如何通过CSRF漏洞和权限缺失实现完全响应的SSRF攻击,并讨论了受影响版本范围及防御措施。Jenkins - CVE-2018-1000600 P…

基于 Reactor 模式的 HTTP 协议扩展实现 - 详解

基于 Reactor 模式的 HTTP 协议扩展实现 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", &…

2025年热门的高速导轨厂家最新TOP实力排行

2025年热门的高速导轨厂家最新TOP实力排行行业背景与市场趋势随着工业4.0的深入推进和智能制造需求的持续增长,高速导轨作为自动化设备的核心部件,其市场规模呈现爆发式增长态势。据《2024-2025全球线性运动部件市场…