iBatis-MyBatis 高频面试题及详细讲解答案(实战版)_第1页
iBatis-MyBatis 高频面试题及详细讲解答案(实战版)_第2页
iBatis-MyBatis 高频面试题及详细讲解答案(实战版)_第3页
iBatis-MyBatis 高频面试题及详细讲解答案(实战版)_第4页
iBatis-MyBatis 高频面试题及详细讲解答案(实战版)_第5页
已阅读5页,还剩2页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

iBatis/MyBatis高频面试题及详细讲解答案(实战版)说明:iBatis是MyBatis的前身,企业面试中大多将两者知识点通用考察,以下题目均为后端Java面试高频原题,答案贴合实战工作场景,摒弃书面套话。一、基础概念类面试题1、说一说iBatis和MyBatis的区别?详细答案:iBatis是早期的持久层框架,2010年项目停止维护,后续迭代升级改名为MyBatis,两者核心思想一致,都是半自动ORM框架。主要区别有三点:第一,版本与架构升级。iBatis配置繁琐,大量配置写在全局xml中,冗余度高;MyBatis简化了配置,新增注解开发、配置默认项,大幅减少冗余代码。第二,功能增强。MyBatis新增动态SQL完整体系、分页插件机制、拦截器插件、日志适配、批量操作优化,iBatis的动态SQL功能非常简陋,实用性很差。第三,适配生态不同。iBatis仅适配传统SSH架构;MyBatis完美适配Spring、SpringBoot,支持mapper接口绑定、自动扫描,是目前企业主流技术。简单来说:MyBatis就是优化重构后的全新iBatis,核心SQL手动编写、轻量、灵活的特点完全保留,解决了旧版本的所有短板。2、什么是半自动ORM?为什么说MyBatis是半自动?详细答案:ORM是对象关系映射,目的是把数据库表和Java实体类做映射,自动完成数据封装。全自动ORM以Hibernate为代表,开发者不用写SQL,框架自动生成SQL,缺点是灵活性差、复杂查询不好控制、调优困难。MyBatis属于半自动:实体映射、结果集封装、参数映射由框架自动完成,核心SQL语句需要开发者手动编写。这种模式最大的优势就是灵活可控,所有SQL都在自己手里,方便优化、适配复杂业务、排查慢查询,这也是互联网公司普遍选用MyBatis的核心原因。3、MyBatis的核心执行流程是什么?详细答案:整体流程分为6步,工作中所有数据库操作都遵循这个逻辑:1、读取全局配置文件和Mapper映射文件,加载所有配置信息、SQL语句、映射规则。2、通过SqlSessionFactoryBuilder解析配置,构建出SqlSessionFactory工厂对象,工厂全局只创建一次。3、由SqlSessionFactory创建SqlSession对象,SqlSession是数据库会话,包含增删改查所有方法,默认不自动提交事务。4、SqlSession根据Mapper接口动态生成代理对象,定位到对应的XML或注解SQL。5、执行器Executor执行SQL,完成参数预处理、SQL执行、结果集封装。6、将数据库返回的ResultSet自动封装为Java实体对象,返回结果,关闭会话。二、配置与映射核心面试题4、MyBatis中#{}和${}的区别?工作中怎么选择?详细答案:这是面试和实战最高频的考点,核心区别两点:第一,预处理机制不同。#{}是预编译参数占位符,底层是PreparedStatement,会对参数做占位赋值,能够有效防止SQL注入;${}是字符串直接拼接,底层直接把参数拼进SQL语句,存在严重的SQL注入风险。第二,解析规则不同。#{}会自动做类型适配、字符串加引号;${}纯文本拼接,不会自动加任何符号。使用场景选择:1、普通查询条件、参数传值,一律用#{},安全、通用。2、动态排序、动态表名、动态字段这类无法使用占位符的场景,只能用${},使用时必须自己做参数校验,防止注入。5、resultType和resultMap的区别?什么时候必须用resultMap?详细答案:resultType是直接指定返回实体类型,适用于数据库字段名和实体属性名基本一致的场景,框架自动映射,写法简单。resultMap是自定义映射规则,手动配置字段和属性的对应关系,功能更强。必须使用resultMap的场景:1、数据库下划线命名和实体驼峰命名不统一,且未开启自动驼峰转换;2、存在一对一、一对多、多对多复杂关联查询;3、需要做字段类型转换、字段别名映射、空值特殊处理;4、查询返回字段少于实体字段,需要精准映射避免赋值错乱。6、MyBatis如何实现实体属性和数据库字段自动映射?详细答案:核心依靠全局配置:map-underscore-to-camel-case=true开启后,框架会自动把数据库下划线字段,对应映射为Java驼峰属性。例如:user_name自动映射userName、user_age自动映射userAge。工作中SpringBoot项目一般直接在配置文件开启,无需手写resultMap,简化开发。三、动态SQL面试题(重点)7、MyBatis常用的动态SQL标签有哪些?各自作用?详细答案:动态SQL是MyBatis最核心的优势,用来解决多条件组合查询、动态参数拼接问题,常用标签如下:1、if:单条件判断,参数不为空时拼接对应查询条件,最常用。2、where:自动处理SQL前缀的and/or,自动去除多余前缀,避免语法报错。3、trim:自定义截取前后缀,可替代where、set,灵活性更高。4、set:用于更新语句,自动去除末尾多余逗号,解决更新字段动态拼接逗号报错问题。5、foreach:遍历集合,多用于in查询、批量新增、批量修改。6、choose/when/otherwise:类似switch判断,多条件互斥场景使用,只命中一个条件。8、foreach标签的核心属性和使用场景?详细答案:foreach主要用来遍历数组、集合,核心属性:collection:指定遍历的集合或数组参数;item:遍历出来的单个元素;index:遍历下标;open:遍历开始拼接的字符,常用(;close:遍历结束拼接的字符,常用);separator:元素之间的分隔符,常用逗号。常见场景:根据id批量删除、批量新增、in范围查询。四、缓存机制面试题(高频原理题)9、MyBatis一级缓存和二级缓存的区别?详细答案:一级缓存(本地缓存)1、默认开启,无需手动配置;2、生命周期和SqlSession绑定,同一个会话内多次查询同一条SQL,会走缓存,不重复查库;3、会话关闭、提交事务、执行增删改操作后,一级缓存会自动清空;4、缓存只在当前会话有效,跨会话无法共享。二级缓存(全局缓存)1、默认关闭,需要手动开启全局配置+Mapper标签开启;2、生命周期和Mapper映射文件绑定,跨SqlSession共享;3、多个用户、多个会话查询相同SQL可以共享缓存数据;4、执行增删改后,对应namespace下的缓存会清空,保证数据一致性。总结:一级缓存是会话级、默认开启、不共享;二级缓存是全局级、手动开启、可共享。10、工作中为什么不建议随意开启二级缓存?详细答案:很多公司生产环境都会关闭二级缓存,核心原因是数据一致性风险高:1、二级缓存以namespace为单位清空,如果A表更新,只会清空当前mapper缓存,跨mapper、跨服务修改同表数据时,缓存不会刷新,会出现脏数据。2、多表联查场景,缓存数据不会随关联表更新而更新,数据滞后严重。3、分布式场景下,二级缓存是本地缓存,不同服务节点缓存数据不一致,问题更突出。实际开发中,热点数据缓存优先用Redis,放弃MyBatis二级缓存,避免脏数据问题。五、事务与SqlSession面试题11、SqlSession是线程安全的吗?为什么?详细答案:SqlSession不是线程安全的,绝对不能做成全局单例、不能注入静态变量共享。原因:SqlSession内部包含数据缓存、事务状态、操作上下文,多线程并发访问时,会出现缓存覆盖、事务错乱、数据混淆的问题。正确用法:每次数据库操作创建独立SqlSession,用完关闭;Spring整合后,由框架自动管理SqlSession,线程独立隔离。12、MyBatis的事务管理方式有几种?详细答案:两种事务模式:1、JDBC事务模式:依托原生JDBC事务,手动控制commit、rollback,适合简单场景。2、MANAGED托管事务:自身不管理事务,将事务交给Spring容器统一管理,项目开发中几乎全部使用这种方式,配合@Transactional注解实现声明式事务。六、实战踩坑与优化面试题13、MyBatis常见的SQL优化手段有哪些?详细答案:1、避免使用select*,只查询业务需要的字段,减少数据传输、提升映射效率。2、合理使用动态SQL,避免无效条件、避免多余拼接导致索引失效。3、批量操作优先使用foreach批量语句,代替循环单条操作,大幅减少数据库连接开销。4、关闭不必要的二级缓存,防止脏数据和内存占用。5、参数查询尽量用#{},避免${}导致的索引失效和注入风险。6、关联查询避免多表深度嵌套,复杂场景拆分查询,减少联表压力。14、MyBatis出现字段赋值为空、属性映射不到的常见原因?详细答案:1、数据库字段下划线、实体驼峰不统一,且未开启自动驼峰转换;2、SQL查询语句未查询对应字段,结果集无数据;3、resultType和返回实体不匹配,或误用resultMap映射错误;4、实体类无空参构造、无getter/setter方法,框架无法反射赋值;5、字段值为null,且全局配置关闭了null值映射。15、说一说MyBatis分页原理?为什么不推荐使用RowBounds?详细答案:RowBounds是MyBatis原生分页,逻辑是查出全量数据后,在内存中截取分页数据,并不是数据库物理分页。数据量小的时候无感知,数据量大时会查询大量无用数据,内存溢出、性能极差。企业实战统一使用PageHelper分页插件,底层基于拦截器实现物理分页,自动拼接limit语句,只查询当前页数据,性能稳定。七、高阶原理面试题16、MyBatisMapper接口为什么不用写实现类?详细答案:核心原理是JDK动态代理。项目启动时,MyBatis扫描所有Mapper接口,通过动态代理为每一个接口生成代理对象。开发者调用接口方法时,实际执行的是代理类逻辑:根据方法名、注解、XML匹配对应的SQL,交由执行器执行,最终返回数据。所以只需要定义接口和SQL,无需手动编写

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论