版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
MyBatis高频面试题(真实职场版)一、基础认知类(初级必问)1、简单说说你对MyBatis的理解?MyBatis是一款优秀的轻量级持久层框架,基于JDBC封装,主要用于Java程序和数据库的交互。它摒弃了传统JDBC繁琐的代码,比如手动加载驱动、创建连接、关闭资源、手动封装结果集等。核心特点是半自动化ORM,不像Hibernate完全自动化生成SQL,也不像原生JDBC过于繁琐。开发者可以自主编写SQL,灵活度高,适配复杂业务场景,同时支持XML和注解两种开发方式,适配绝大多数中小型项目和互联网项目。2、MyBatis和JDBC、Hibernate的区别?MyBatisvsJDBC:JDBC原生代码冗余极高,需要手动管理连接、语句、结果集,代码耦合度高;MyBatis封装了通用操作,自动管理资源,SQL与代码分离,可维护性更强。MyBatisvsHibernate:Hibernate是全自动ORM框架,无需手写SQL,开发效率高,但SQL可控性差,复杂查询、多表关联、性能调优难度大;MyBatis半自动,手动写SQL,灵活度高、性能可控、调优简单,互联网项目主流选型。3、MyBatis的核心组件有哪些?各自作用是什么?SqlSessionFactory:核心工厂类,用于创建SqlSession,全局唯一,一般项目中单例存在。SqlSession:数据库会话对象,包含所有数据库操作的方法,线程不安全,每次数据库请求新建、用完关闭。Mapper:数据访问接口,定义数据库操作方法,无实现类,由MyBatis动态代理生成实现。Executor:执行器,负责SQL执行、缓存管理,是MyBatis底层执行核心。MappedStatement:封装XML/注解中编写的SQL语句、参数类型、返回值类型等配置信息。ResultHandler:结果集处理器,负责将数据库查询结果封装为Java对象。4、MyBatis中#{}和${}的区别?日常开发如何选择?#{}:预编译占位符底层生成PreparedStatement,参数占位赋值,有效防止SQL注入会自动对字符串加引号、转义特殊字符适用绝大多数参数传递场景(查询条件、新增修改参数等)${}:字符串直接拼接底层直接拼接SQL语句,无预编译,存在SQL注入风险不会自动添加引号,原样拼接参数内容仅适用于动态表名、动态排序字段、动态字段等无法使用预编译的场景开发规范:优先使用#{},${}仅特殊场景使用,且必须手动做参数校验过滤。二、核心配置与语法类(中级高频)1、MyBatis全局配置文件(mybatis-config.xml)常用标签有哪些?常用核心标签按优先级排序:properties:引入外部配置文件(如数据库配置properties)settings:全局参数设置(开启驼峰命名、日志、缓存、超时时间等)typeAliases:实体类别名配置,简化Mapper返回值、参数书写typeHandlers:自定义类型处理器,处理数据库字段与Java类型转换environments:数据库环境配置,可配置多套环境(开发、测试、生产)mappers:注册所有Mapper映射文件/接口2、resultType和resultMap的区别?什么时候必须用resultMap?resultType:直接指定返回值类型,适用于数据库字段名和实体类属性名一致,或开启驼峰命名自动转换的简单场景,写法简洁。resultMap:手动映射数据库字段与实体类属性,支持复杂映射,适用场景:字段名和属性名不匹配,且未开启驼峰命名实体类存在组合属性、一对一、一对多关联查询需要自定义字段类型转换、字段别名映射多表联查返回复合数据3、MyBatis动态SQL常用标签及使用场景?动态SQL核心作用:解决多条件组合查询、动态新增修改的SQL冗余、语法错误问题,常用标签:if:单条件判断,非空、非空字符串判断,最常用where:自动去除多余的and/or,解决多if拼接导致的语法错误trim:自定义截取前缀、后缀,可替代where、set,灵活性更高set:用于更新语句,自动去除末尾多余逗号foreach:遍历集合,多用于in查询、批量新增/批量修改choose/when/otherwise:多条件分支选择,类似switch逻辑,只匹配一个条件bind:绑定变量,拼接模糊查询条件,避免数据库兼容问题4、MyBatis批量新增的实现方式及优缺点?方式一:foreach循环拼接SQL直接在insert标签中通过foreach遍历集合,拼接多条values。优点:写法简单、无需额外配置;缺点:数据量过大时SQL语句过长,容易触发数据库报错,有长度限制。方式二:SqlSession批量提交开启批量模式SqlSession,循环调用单次insert,最后统一提交。优点:支持大数据量批量插入,性能稳定;缺点:代码稍繁琐,需要手动控制事务和提交时机。生产建议:小批量数据(1000条以内)用foreach,大批量数据用SqlSession批量模式,避免一次性拼接超长SQL。三、缓存机制(面试高频重难点)1、MyBatis一级缓存、二级缓存的区别?一级缓存(本地缓存)默认开启,无需手动配置作用域:同一个SqlSession内生命周期:SqlSession创建时生成,关闭/清空时失效生效场景:同一会话中,相同SQL、相同参数重复查询,直接走缓存,不访问数据库失效场景:执行增删改操作、手动clearCache、关闭SqlSession二级缓存(全局缓存)默认关闭,需要手动开启配置作用域:同一个Mapper命名空间,跨SqlSession生效生命周期:项目运行期间持久存在,重启项目、清空缓存才会失效使用要求:实体类必须实现序列化接口、Mapper开启cache标签2、MyBatis二级缓存的使用坑点?生产中是否常用?常见坑点:增删改默认只会清空当前命名空间缓存,多表关联操作时,其他Mapper缓存不会刷新,导致数据脏读二级缓存是粗粒度缓存,无法精准控制单条数据缓存失效分布式项目中,多个服务节点缓存不互通,数据一致性差生产建议:单体项目静态数据、低频变更数据可使用二级缓存;互联网分布式项目基本不使用,统一用Redis做分布式缓存,规避脏数据问题。四、底层原理与源码相关(中高级面试)1、MyBatisMapper接口没有实现类,为什么可以直接调用方法?核心原理是JDK动态代理。项目启动时,MyBatis会扫描所有Mapper接口,通过动态代理为接口生成代理对象。开发者调用Mapper方法时,实际执行的是代理类的invoke方法。代理方法会根据方法名、参数匹配对应的MappedStatement,获取对应的SQL,交给Executor执行数据库操作,最终封装结果返回,无需手动编写实现类。2、MyBatis的执行流程简单说一下?加载mybatis-config.xml全局配置和Mapper映射文件,解析所有配置信息构建SqlSessionFactory工厂对象,封装所有配置环境通过工厂获取SqlSession数据库会话SqlSession获取Mapper代理对象调用Mapper方法,触发动态代理逻辑,匹配对应SQLExecutor执行器执行SQL,通过JDBC与数据库交互ResultHandler封装查询结果,返回Java对象关闭SqlSession,释放数据库连接资源3、MyBatis的Executor执行器有几种?区别是什么?SIMPLE(默认):简单执行器,每次查询都会新建Statement,执行完毕关闭,适合普通单次查询REUSE:可复用执行器,会缓存Statement对象,重复执行相同SQL时复用,减少创建销毁开销BATCH:批量执行器,专门用于批量增删改,批量攒够数据后统一提交,提升批量操作性能五、实战坑点与优化(面试加分项)1、MyBatis常见的报错及解决方案?Invalidboundstatement:Mapper接口方法名和XML语句ID不一致、Mapper文件未注册、路径配置错误字段不匹配、无法映射:未开启驼峰命名、resultMap映射错误、实体类属性名写错SQL语法错误:动态SQL多多余and/or、多余逗号、foreach拼接格式错误数据绑定异常:参数名与SQL取值不一致、未使用@Param注解、集合参数未正确传递2、MyBatis如何进行性能优化?合理使用动态SQL,避免无效查询、全表查询分页查询必须加limit,禁止大数据量全量查询大批量操作使用BATCH执行器,避免循环单次提交关闭不必要的二级缓存,避免脏数据,一级缓存合理利用复杂多表查询避免嵌套查询,优先联表查询,减少数据库交互次数开启MyBatis日志,监控慢SQL,配合数据库索引优化查询时按需返回字段,禁止select*3、@Param注解的使用场景?为什么有时候必须加?当Mapper接口存在多个参数时,必须使用@Param绑定参数名。原因:Java编译后会丢失方法参数名,MyBatis无法识别多个参数对应的取值,通过@Param可以手动指定参数映射名称,保证SQL可以正常取值。单个参数、集合参数、实体类参数无需添加@Param。六、SpringBoot+MyBatis整合专项1、SpringBoot整合MyBatis的核心依赖和配置?核心依赖:mybatis-spring-boot-starter、数据库驱动、druid连接池等。核心
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 免疫层析NC膜进入结构性增长阶段高灵敏度与多重检测打开新空间
- 2026年六安霍山县殡仪馆招聘编外工作人员3名考试备考试题及答案解析
- 开学第一课红色教育筑梦新学期主题班会课件
- 2026年柳州市烟草专卖局人员招聘考试备考题库及详细答案解析
- 2026年中煤矿山建设集团有限责任公司人员招聘笔试参考题库及详细答案解析
- 2026年黑河市烟草专卖局人员招聘笔试参考试题及详细答案解析
- 2026年乌海市烟草专卖局人员招聘考试模拟试题及详细答案解析
- 2026年淮北市烟草专卖局人员招聘考试备考题库及详细答案解析
- 2026年鸡西市烟草专卖局人员招聘考试参考试题及详细答案解析
- 2026年太原铁路局人员招聘笔试参考题库及详细答案解析
- 2026年癌症早诊早治项目实施方案
- 2026新教材语文 六年级上册语文园地三 课件
- 2026年湖南省高考真题历史试题试卷答案解析
- 2026年精神卫生日宣传课件
- 室外消防给水管道敷设施工方案
- 2026秋新教材人教版四年级上册数学|第三单元 多位数乘两位数 教案(共13课时)
- 《建筑赋比兴》一些笔记和摘录(上)
- 日常生活中的自我呈现课件
- 2021新版GJB9001C-2017体系文件内审检查表
- 大学生物学知到章节答案智慧树2023年浙江大学
- GB/T 15623.3-2022液压传动电调制液压控制阀第3部分:压力控制阀试验方法
评论
0/150
提交评论