📖 前言导读
MyBatis是Java主流持久层框架、面试高频必考ORM框架,也是SSM、SpringBoot项目数据库交互的核心组件,所有后端开发均需熟练掌握。多数开发者仅会编写XML映射文件、调用Mapper接口,对MyBatis底层执行流程、ORM映射原理、缓存机制、动态SQL、参数绑定、SQL注入规避等核心原理认知模糊,面试常被源码深挖环节难住。本篇全方位拆解MyBatis全套核心知识点,深度解析底层执行流程、一级二级缓存、动态SQL、分页原理、批量操作、高频坑点,搭配真题解析与生产规范,吃透持久层框架底层原理,搞定数据库交互面试所有考点。
一、MyBatis核心优势与定位
📌 必考指数:★★★★★
MyBatis是一款轻量级、半自动ORM持久层框架,用于替代JDBC原生操作,简化数据库增删改查开发,解决原生JDBC代码冗余、硬编码、资源繁琐的问题。
轻量级:无冗余依赖、框架小巧、侵入性极低
半自动ORM:手动编写SQL语句,自动完成参数映射、结果集封装,兼顾灵活性与便捷性
解耦SQL:SQL语句与Java代码分离,统一维护、便于优化迭代
性能优异:支持缓存、预编译SQL、批量操作,数据库交互性能高
二、MyBatis核心执行流程
📌 必考指数:★★★★★
MyBatis完整执行流程是面试核心源码考点,整体分为加载配置、创建会话、执行SQL、结果封装、资源关闭五大核心环节。
完整流程:1、加载全局配置文件与Mapper映射文件,解析生成Configuration全局配置对象;2、通过SqlSessionFactory创建SqlSession会话;3、SqlSession获取Mapper代理对象;4、代理对象调用接口方法,执行预编译SQL;5、参数处理器完成参数绑定,执行数据库操作;6、结果集处理器封装返回实体对象;7、关闭会话、释放资源。
三、MyBatis缓存机制(一级+二级)
📌 必考指数:★★★★★
缓存是MyBatis优化数据库查询性能的核心机制,分为一级缓存与二级缓存,二者作用范围、生命周期、失效场景是高频对比考点。
1、一级缓存(本地缓存)
默认开启、SqlSession级别缓存,同一会话中相同SQL查询直接读取缓存,无需访问数据库。失效场景:会话关闭、执行增删改操作、手动清空缓存,一级缓存自动失效。
2、二级缓存(全局缓存)
需手动开启、Mapper级别缓存,作用于整个Mapper映射文件,跨SqlSession会话共享缓存数据。开启方式:全局配置开启二级缓存 + Mapper文件添加cache标签。失效场景:对应Mapper执行增删改操作,自动清空对应二级缓存。
四、动态SQL核心标签
📌 必考指数:★★★★
动态SQL是MyBatis核心特色,可根据参数动态拼接SQL语句,解决传统SQL硬编码、参数判断繁琐的问题,适配多条件模糊查询、动态筛选场景。
<if>:条件判断,参数非空则拼接对应SQL片段
<where>:自动去除多余and/or,解决拼接语法错误
<choose>/<when>/<otherwise>:多条件分支选择,满足其一即终止
<foreach>:遍历集合参数,适配批量新增、批量删除、in查询场景
<trim>:自定义截取前缀后缀,灵活处理SQL拼接冗余字符
五、#{}与${}参数取值区别
📌 必考指数:★★★★★
二者是MyBatis参数绑定核心方式,底层原理、安全性、适用场景差异极大,是面试高频坑点与生产核心规范。
#{}预编译取值:底层生成PreparedStatement,参数占位符赋值,彻底防止SQL注入,支持参数类型适配,日常查询优先使用
${}字符串拼接取值:直接字符串拼接SQL,存在SQL注入风险,无预编译机制,仅适用于动态表名、排序字段等无法预编译场景
六、本篇高频面试真题(必背)
1、MyBatis完整执行流程?
1、读取MyBatis全局配置文件和Mapper映射文件,解析封装为Configuration配置对象;2、通过SqlSessionFactoryBuilder构建SqlSessionFactory工厂;3、工厂创建SqlSession数据库会话;4、SqlSession获取Mapper接口代理对象;5、代理对象拦截方法调用,完成参数解析、SQL预编译;6、执行数据库CRUD操作,封装结果集为Java对象;7、关闭SqlSession,释放数据库连接资源。
2、一级缓存和二级缓存的区别?
1、开启状态:一级缓存默认开启,二级缓存需手动配置开启;2、作用范围:一级缓存是SqlSession会话级别,仅当前会话有效,二级缓存是Mapper级别,跨会话共享;3、生命周期:一级缓存会话关闭即清空,二级缓存随项目生命周期存续;4、优先级:查询优先读取二级缓存,无数据再查询一级缓存,最后访问数据库。
3、#{}和${}的核心区别与使用场景?
1、原理不同:#{}是预编译占位符,{}是直接字符串拼接;2、安全性不同:#{}杜绝SQL注入,\{\}是直接字符串拼接;2、安全性不同:\#\{\}杜绝SQL注入,{}是直接字符串拼接;2、安全性不同:#{}杜绝SQL注入,{}存在注入风险;3、场景不同:常规条件查询、参数传递优先用#{};动态表名、排序字段、数据库关键字场景只能用${};4、性能不同:#{}支持SQL预编译缓存,复用执行计划,性能更优。
4、MyBatis动态SQL的作用与常用标签?
作用:根据传入参数动态拼接、裁剪SQL语句,解决多条件查询硬编码、SQL冗余、语法错误问题,适配复杂业务查询场景。常用标签:<if>条件判断、<where>自动去除多余连接符、<foreach>集合遍历、<choose>多分支选择、<trim>自定义裁剪字符,大幅提升SQL灵活性与复用性。
📝 本篇章节小结
本篇全覆盖MyBatis框架定位、核心执行流程、一二级缓存机制、#{}与${}区别、动态SQL、参数绑定原理所有高频考点。重点掌握完整执行链路、缓存失效场景、参数取值规范、动态SQL用法,彻底吃透持久层框架底层原理,规范数据库交互代码写法,规避SQL注入、缓存失效、SQL语法错误等生产坑点,从容应对MyBatis源码面试深挖与复杂数据库业务开发。