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

下载本文档

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

文档简介

iBatis/MyBatis常见面试题及详细答案(实战版)说明:早期持久层框架为iBatis,后续迭代升级为MyBatis,企业面试中大多将两者知识点通用考察,以下题目均为后端开发高频面试原题,答案贴合实际开发工作场景,通俗易懂、无书面化套话。一、基础概念类1、简单说说iBatis/MyBatis的核心特点,和Hibernate有什么区别?参考答案:MyBatis是一款轻量级的半自动ORM持久层框架,核心是帮我们简化JDBC操作,避免重复的代码冗余。它最大的特点是SQL与代码分离,SQL语句写在XML或者注解里,完全由开发者手动控制,灵活性极高。和Hibernate的核心区别主要有三点:1)框架类型不同:MyBatis是半自动ORM,需要自己写SQL;Hibernate是全自动ORM,通过对象操作自动生成SQL,无需手动编写。2)灵活性不同:MyBatis适配复杂SQL、多表关联、动态查询、数据库优化场景,适配所有数据库;Hibernate封装太重,复杂SQL编写麻烦,自定义优化难度大。3)性能与适配场景:MyBatis轻量、开销小、SQL可控,适合互联网高并发、复杂业务场景;Hibernate适合传统企业简单CRUD项目,开发速度快,但高并发场景性能短板明显。2、MyBatis的核心工作原理是什么?整体执行流程简单说一下参考答案:整体流程可以分为6个核心步骤,也是源码执行的核心链路:1)加载配置文件:项目启动时,加载mybatis核心配置文件、Mapper映射文件,解析所有配置信息存入全局配置对象。2)构建SqlSessionFactory:通过配置信息创建会话工厂,这是全局单例对象,负责生产数据库会话。3)获取SqlSession:从工厂中获取SqlSession对象,SqlSession是操作数据库的核心会话,包含数据库连接、事务、执行器等核心组件。4)获取Mapper代理对象:通过SqlSession获取对应的Mapper接口代理对象,无需手动写接口实现类。5)执行SQL并封装结果:调用Mapper方法后,框架匹配对应的SQL语句,预处理参数、执行JDBC查询/更新,然后将数据库返回的结果集自动映射为Java对象。6)关闭资源:执行完毕后,关闭SqlSession、释放数据库连接,避免连接泄露。3、SqlSession、SqlSessionFactory、MapperProxy三者的关系?参考答案:1)SqlSessionFactory:全局单例,整个项目只有一个,是工厂角色,专门用来创建SqlSession,负责初始化所有配置、连接池、映射规则。2)SqlSession:线程不安全,单次数据库操作会话,每次请求/事务都需要新建,用完即关。它是数据库操作的入口,包含事务控制、SQL执行、结果映射能力。3)MapperProxy(Mapper代理对象):SqlSession根据Mapper接口生成的动态代理对象,开发者直接调用接口方法,底层由代理对象拦截方法,执行对应的SQL逻辑,屏蔽了底层JDBC细节。二、核心配置与映射考点4、MyBatis中#{}和${}的区别?日常开发如何选择?参考答案:这是面试最高频考点,核心区别集中在预编译、安全、场景三个方面:1)编译方式不同:#{}是预编译参数占位符,底层会生成?占位符,通过JDBC预编译赋值;${}是字符串直接拼接,直接把参数内容拼接到SQL语句中,无预编译。2)安全性不同:#{}可以彻底防止SQL注入;${}完全无法防SQL注入,参数可控性差,存在极大安全风险。3)适用场景不同:#{}用于常规参数传递,比如where条件、新增修改字段值;${}仅用于动态表名、动态字段、排序字段这类无法使用预编译的场景。开发规范:优先全部使用#{},只有动态表名、排序等特殊场景才谨慎使用${},且必须对参数做白名单校验。5、MyBatis实体类属性和数据库字段名不一致怎么解决?参考答案:日常开发中最常见的问题,有三种主流解决方案:1)全局驼峰命名自动转换:在核心配置文件开启mapUnderscoreToCamelCase=true,数据库下划线字段(user_name)自动映射为Java驼峰属性(userName),最常用、最简洁。2)手动配置resultMap映射:自定义resultMap,明确指定数据库column对应实体类property,适配复杂字段、多表查询、字段名无规律的场景,精准可控。3)SQL语句起别名:在select查询语句中,给数据库字段起和实体属性一致的别名,简单临时场景可以使用,不适合统一维护。6、resultType和resultMap的区别?分别什么时候用?参考答案:1)resultType:直接指定返回值的实体类、基本数据类型。适用于字段名和属性名匹配、简单单表查询,框架自动完成映射,配置简单。2)resultMap:自定义映射规则,支持字段手动映射、类型转换、一对一、一对多关联查询、嵌套查询。适用于字段不匹配、多表关联、复杂嵌套结果。核心注意:二者不能同时使用,一个查询标签只能选其一。三、动态SQL高频考点7、MyBatis常用的动态SQL标签有哪些?各自作用?参考答案:动态SQL核心作用是根据参数动态拼接SQL,避免多余的and、or、逗号等语法错误,常用标签:1)if:条件判断,参数非空非空字符串时拼接对应SQL,用于动态查询条件。2)where:自动去除第一个多余的and/or,解决if嵌套导致的SQL语法错误。3)trim:自定义截取规则,可替代where、set,能去除前缀、后缀指定字符,灵活性最高。4)set:用于更新语句,自动去除最后一个多余的逗号,适配动态更新字段场景。5)foreach:遍历集合,常用于in查询、批量新增/批量删除,支持设置分隔符、前后缀。6)choose/when/otherwise:类似switch-case,多条件互斥判断,只会匹配一个条件执行。8、foreach标签常用属性?批量操作有什么注意点?参考答案:foreach核心属性:collection(遍历的集合/数组)、item(遍历单个元素)、index(下标)、open(语句前缀)、close(语句后缀)、separator(元素分隔符)。开发注意点:1)集合参数必须非空,否则会报空指针,需要提前判空;2)数据库对in查询长度有限制,MySQL默认支持长度有限,大批量数据需要拆分集合分批查询;3)批量新增不要一次性传入上万条数据,容易导致SQL超长、数据库锁表,建议分批批量插入。四、缓存机制面试重点9、MyBatis一级缓存和二级缓存的区别?生效场景和失效条件?参考答案:一级缓存(默认开启)1)级别:SqlSession级别,也就是单次数据库会话缓存;2)生效范围:同一个SqlSession中,相同查询语句、相同参数,第二次查询不会访问数据库,直接读缓存;3)失效场景:SqlSession关闭、提交事务、执行增删改操作、手动清空缓存,一级缓存都会失效。二级缓存(默认关闭,需手动开启)1)级别:Mapper命名空间级别,全局缓存,跨SqlSession生效;2)生效范围:同一个Mapper下的查询,不同会话、不同请求都能共享缓存数据;3)开启条件:核心配置开启二级缓存、Mapper文件配置cache标签、实体类实现序列化接口;4)失效场景:该命名空间下执行增删改操作,会清空对应二级缓存。开发总结:一级缓存日常开发默认生效,不用手动处理;二级缓存实际项目中很少用,因为多表操作、分布式场景下容易出现缓存数据不一致问题,一般用Redis替代二级缓存。10、为什么不建议使用MyBatis二级缓存?参考答案:1)数据一致性差:如果一张表被多个Mapper操作,一个Mapper更新数据后,只会清空自己的二级缓存,其他Mapper依然读取旧缓存数据,出现数据脏读。2)分布式场景无效:二级缓存是本地内存缓存,只在当前服务实例生效,集群部署时不同节点缓存不互通,数据不一致问题更严重。3)维护成本高:需要实体类序列化、手动配置,且无法设置过期时间、淘汰规则,灵活性极差。实际开发中,统一使用Redis做二级缓存,可控性、一致性、性能都远优于原生二级缓存。五、关联查询与嵌套映射11、MyBatis一对一、一对多关联查询怎么实现?有什么坑?参考答案:两种实现方式:嵌套结果查询(联表查询)、嵌套子查询(分步查询)1)一对一:通过association标签实现,适合单条关联数据,联表查询一次性查出所有数据,效率高。2)一对多:通过collection标签实现,适合集合关联数据。常见坑点:1)一对多查询时,如果不设置主键映射,容易出现数据重复封装问题;2)分步查询容易产生N+1查询问题:查1次主表,再循环查询N次子表,数据量大时性能极差;3)关联嵌套过深会导致结果映射混乱,复杂业务不建议过度依赖MyBatis关联映射,优先业务层组装数据。六、事务与实战坑点12、MyBatis的事务管理方式有哪些?参考答案:1)JDBC事务:原生JDBC事务,依靠Connection控制提交、回滚,默认手动提交,适合简单项目。2)MANAGED托管事务:不自己管理事务,将事务交给容器(Spring)管理,日常SSM、SpringBoot项目都是使用这种方式,通过@Transactional注解实现事务控制。13、MyBatis常见的开发踩坑点有哪些?参考答案:整理工作中最高频的6个坑:1)SQL注入问题:误用${}接收普通参数,导致注入漏洞;2)缓存脏数据:依赖一级缓存导致读取旧数据,批量操作后未刷新缓存;3)N+1查询问题:一对多分步查询未优化,大数据量下接口超时;4)参数空指针:foreach遍历未判空,传入空集合直接报错;5)字段映射失效:未开启驼峰转换、resultMap映射错误,导致查询字段为null;6)SqlSession线程不安全:将SqlSession定义为全局变量,多线程并发操作导致数据错乱。七、进阶优化考点14、如何优化MyBatis查询性能?参考答案:结合实战的优化方案:1)SQL优化:避免select*,只查询需要字段;优化联表查询、避免无效嵌套;分页查询必须加limit。2)解决N+1问题:优先使用联表嵌套结果查询,替代分步子查询;大数据量使用批量查询。3)合理使用缓存:利用一级缓存优化单次会话重复查询;禁用原生二级缓存,改用Redis分布式缓存。4)分页优化:避免count(*)全表统计,大表分页使用分页插件优化、延迟统计总数。5)批量操作优化:批量新增、更新使用分批处理,单次操作数据量控制在100-500条,避免数据库压力过大。15、MyBatis分页原理?为什么不推荐自己写分页SQL?参考答案:MyBatis

温馨提示

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

评论

0/150

提交评论