下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
MyBatis高频面试题(真实面试版)一、基础认知类(入门必问)1、简单说说你对MyBatis的理解?MyBatis是一款轻量级的Java持久层框架,属于半自动ORM框架。它封装了JDBC的底层操作,避免了原生JDBC频繁创建连接、关闭连接、手动封装结果集、硬编码SQL的繁琐问题。和Hibernate全自动ORM框架不同,MyBatis需要开发者手动编写SQL语句,灵活性更高,适配复杂查询、多表关联、动态SQL场景,日常企业项目中使用率极高。同时支持XML和注解两种SQL编写方式,适配不同开发习惯。2、MyBatis和JDBC、Hibernate的区别?MyBatisvsJDBC:JDBC原生代码冗余,需要手动处理连接、预处理、结果集封装,代码耦合度高;MyBatis封装了通用流程,SQL和代码解耦,自动完成结果集映射,代码更简洁、易维护。MyBatisvsHibernate:Hibernate是全自动ORM,完全不用写SQL,开发效率高,但优化难度大,复杂查询适配性差;MyBatis半自动,手动写SQL,灵活度高、便于SQL优化、适配复杂业务,性能可控,更适合互联网项目。3、MyBatis的核心组件有哪些?各自作用是什么?1.SqlSessionFactory:核心工厂类,用于创建SqlSession,全局唯一,一般项目中只初始化一次。2.SqlSession:会话对象,负责执行CRUD操作,线程不安全,每次数据库请求需要新建,用完关闭。3.Mapper接口/Mapper文件:定义数据库操作方法,XML文件中编写对应SQL,实现方法与SQL的绑定。4.Executor执行器:SqlSession底层调用的执行组件,负责调度SQL执行、缓存操作、事务管理。5.ResultHandler:结果集处理器,负责将数据库查询结果封装为Java实体对象。6.ParameterHandler:参数处理器,负责预处理SQL参数、完成参数类型转换。二、核心原理与执行流程(高频深挖)1、说说MyBatis的完整执行流程?1.加载MyBatis全局配置文件和Mapper映射文件,解析配置信息、SQL语句、映射规则;2.通过SqlSessionFactoryBuilder构建SqlSessionFactory工厂实例;3.由SqlSessionFactory创建SqlSession数据库会话;4.SqlSession获取对应的Mapper代理对象;5.调用Mapper接口方法,底层通过动态代理拦截方法请求;6.获取对应的预编译SQL,通过ParameterHandler处理参数,Executor执行SQL;7.ResultHandler封装查询结果,返回实体对象,最终关闭SqlSession。2、MyBatis的Mapper接口为什么不需要实现类?MyBatis启动时会扫描所有Mapper接口和对应的XML文件,建立接口方法与SQL语句的映射关系。程序调用Mapper接口方法时,MyBatis会通过JDK动态代理自动生成Mapper接口的代理对象,拦截方法调用,根据方法名和参数匹配对应的SQL并执行,无需开发者手动编写实现类。3、#{}和${}的区别?日常开发怎么选择?1.#{}:预编译参数占位符,会自动进行SQL预编译、参数转义,有效防止SQL注入,支持参数类型自动转换,日常查询、新增、修改的参数传递优先使用。2.${}:字符串直接拼接,不会预编译、不转义参数,存在SQL注入风险,安全性低。一般用于动态表名、动态字段、排序字段等无法使用预编译的场景。核心原则:能用#{}绝不使用${},${}使用时必须手动校验参数合法性。4、MyBatis参数传递的方式有哪些?1.单个基本类型参数:直接传值,#{}中直接写参数名即可;2.多个参数:默认使用param1、param2取值,也可通过@Param注解指定参数名;3.实体类参数:直接传入对象,#{}中写对象属性名;4.Map集合参数:传入Map,#{}中写Map的key值。三、动态SQL相关(业务高频)1、MyBatis常用的动态SQL标签有哪些?各自场景?-if:条件判断,用于非必传参数的动态拼接,比如多条件模糊查询;-where:自动去除多余的and/or,解决多if拼接导致的语法错误;-set:更新场景使用,自动去除末尾多余的逗号;-trim:自定义拼接规则,可替代where、set,灵活去除前后多余字符;-foreach:遍历集合,常用于in查询、批量新增/批量修改;-choose/when/otherwise:多条件分支选择,类似switch-case,只会匹配一个条件;-include/sql:抽取通用SQL片段,复用代码,减少冗余。2、foreach标签的核心属性有哪些?collection:指定遍历的集合/数组对象;item:遍历的单个元素;index:索引;open:拼接开头字符;close:拼接结尾字符;separator:元素之间的分隔符。3、动态SQL拼接会出现SQL语法错误,怎么解决?优先使用where、set标签自动剔除多余的and、or、逗号;复杂场景使用trim标签自定义截取规则,从根源避免语法报错。四、缓存机制(面试重点)1、MyBatis的一级缓存和二级缓存区别?一级缓存(本地缓存):默认开启,属于SqlSession级别缓存。同一个SqlSession内,相同的查询请求会缓存结果,避免重复查库。SqlSession关闭、提交事务、执行增删改操作后,缓存会自动清空。不同SqlSession之间缓存不共享。二级缓存(全局缓存):默认关闭,属于Mapper级别缓存,跨SqlSession共享。开启后,同一个Mapper下的查询数据会被缓存,多个会话可以共用缓存数据,提升查询效率。需要手动配置开启,且实体类需要实现序列化接口。2、二级缓存的开启步骤?1.全局配置文件中开启二级缓存总开关;2.在对应Mapper.xml文件中添加<cache/>标签;3.实体类实现Serializable序列化接口;4.确保查询方法对应的结果集可缓存。3、MyBatis缓存的失效场景?1.执行insert、update、delete增删改操作后,一级、二级缓存都会清空;2.一级缓存:SqlSession手动关闭、手动清空缓存、事务提交后失效;3.二级缓存:手动清空对应Mapper缓存、项目重启、缓存过期后失效。4、日常开发中为什么很多项目不推荐开启二级缓存?二级缓存是粗粒度的Mapper级缓存,多表关联查询、数据更新频繁的场景下,容易出现缓存数据和数据库数据不一致的问题,引发脏数据。而且分布式项目中,二级缓存是本地缓存,无法跨服务共享,适配性差,一般会用Redis替代MyBatis二级缓存。五、映射与结果处理(实操考点)1、resultType和resultMap的区别?resultType:自动映射,适用于数据库字段名和实体类属性名一致、简单单表查询的场景,写法简洁,无需手动配置映射关系。resultMap:手动自定义映射,适用于字段名和属性名不一致、多表关联查询、嵌套查询、复杂字段映射的场景,支持主键映射、关联映射、字段类型转换,功能更强大。2、数据库字段和实体类属性名不一致,有几种解决方式?1.SQL查询中使用as别名,将数据库字段别名改为实体类属性名;2.在Mapper.xml中通过resultMap手动配置字段与属性的映射关系;3.全局配置开启驼峰命名自动转换,数据库下划线字段自动映射实体类驼峰属性。3、MyBatis一对一、一对多关联查询怎么实现?一对一:通过resultMap的<association>标签关联单个实体对象;一对多:通过resultMap的<collection>标签关联集合对象,常用于用户关联订单、部门关联员工等场景。六、事务与批量操作1、MyBatis的事务管理方式?分为两种:JDBC事务和MANAGED事务。JDBC模式依靠原生JDBC事务,默认自动提交关闭,需要手动提交/回滚;MANAGED模式将事务交给容器(Spring)管理,项目整合Spring后,基本都是由Spring统一管控事务,MyBatis自身不单独处理事务。2、MyBatis批量插入的方式有哪些?各自优缺点?1.foreach循环单次插入:代码简单,数据量小可用,大数据量SQL过长、性能差,容易超时;2.Batch批量处理器:通过SqlSession批量提交,减少数据库交互次数,性能更高,适合大批量数据插入,是企业常用方案。七、常见坑与优化问题(面试加分项)1、MyBatis常见的踩坑点有哪些?1.忘记加@Param注解,多参数取值报错;2.使用${}导致SQL注入漏洞;3.动态SQL多if拼接出现多余and/or,引发SQL语法错误;4.一级缓存导致查询脏数据,未及时刷新缓存;5.实体类无空参构造,导致结果集映射失败;6.批量操作未使用批量模式,频繁交互数据库,性能低下。2、如何优化MyBatis查询性能?1.编写规范SQL,避免select*,只查询需要的字段;2.合理使用动态SQL,减少无效查询条件;3.大批量操作使用Batch批量模式,减少数据库连接次数;4.合理利用一级缓存,谨慎使用二级缓存,避免脏数据;5.开启驼峰映射、复用SQL片段,精简代码;6.复杂多表查询优化SQL逻辑,必要时分页查询、分批次处理数据。3、MyBatis分页原理?为什么不推荐使用自带RowBounds分页?MyBatis自带的RowBounds是内存分页,会一次性查询出所有数据,在内存中截取分页数据,数据量大时会造成内存溢出、查询卡顿。企业开发统一使用PageHelper分页插件,基于数据库物理分页,性能更优。八、Spring整合MyBatis相关1、Spring整合MyBatis的核心配置是什么?1.配置数据源DataSour
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年度宁夏吴忠市专业技术人员继续教育公需科目试卷及答案
- 初中八年级数学教学设计:百分数在商品促销中的实际应用
- 小学六年级英语教案-An interesting country
- 高二英语译林版选择性必修二 Unit 3 Welcome to the unit 教学设计
- 初中物理九年级电流和电路专题一轮复习教学设计
- 高中生物选择性必修1 稳态与调节 单元复习教学设计
- 高一化学教学设计:元素周期表的构建与规律探究
- 初中美术八年级上册第五单元《用色彩编织如画校园》教学设计
- 高一政治必修三《9.4 全民守法》教学设计
- 六年级语文《小站》教案
- 磷化铟单晶片项目申请报告
- 数字化肉牛育肥项目可行性研究报告
- 2026年上海政府采购评审专家考试测试题及答案
- 2023年外国电影史经典笔记和考题
- 克隆动物养殖行业市场供需现状及价值投资规划
- 屋面层拆除工程施工方案
- 历年中考英语高频词汇汇编(真题800词完整版)
- 2026山东能源集团中级人才库选拔易考易错模拟试题(共500题)试卷后附参考答案
- 2026年4月自考13015计算机系统原理试题试题及答案
- 2026年蜜雪冰城加盟考试题及答案
- 锅炉联锁试验卡
评论
0/150
提交评论