MyBatis 企业高频面试题(真实面试向)_第1页
MyBatis 企业高频面试题(真实面试向)_第2页
MyBatis 企业高频面试题(真实面试向)_第3页
MyBatis 企业高频面试题(真实面试向)_第4页
MyBatis 企业高频面试题(真实面试向)_第5页
已阅读5页,还剩1页未读, 继续免费阅读

下载本文档

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

文档简介

MyBatis企业高频面试题(真实面试向)一、基础认知类(入门必问,筛选基础功底)1、说说你对MyBatis的理解?它和JDBC相比优势在哪?MyBatis是一款轻量级的半自动ORM持久层框架,核心作用是简化数据库操作,负责Java实体类和数据库表的映射关系。和原生JDBC相比,优势主要有四点:1.简化代码:无需手动编写加载驱动、创建连接、创建Statement、关闭资源等冗余代码,框架自动管理;2.解耦SQL:SQL语句统一写在XML或注解中,和Java代码分离,便于统一维护、修改和优化,不用改动业务代码;3.自动映射:支持数据库字段和实体类属性自动映射,无需手动封装ResultSet结果集,减少重复赋值代码;4.灵活可控:保留了原生SQL的灵活性,支持动态SQL、自定义查询条件,不像Hibernate全自动ORM那样笨重,适配各类复杂业务场景。2、MyBatis是什么类型的ORM框架?半自动和全自动的区别是什么?MyBatis属于半自动ORM框架。区别核心在于SQL的控制权:1.全自动ORM(如Hibernate、JPA):框架自动生成SQL,开发者无需编写SQL,封装度极高,但灵活性差,复杂查询、多表关联查询优化难度大;2.半自动ORM(MyBatis):SQL由开发者手动编写,框架只负责映射、参数封装、结果返回,兼顾了简化开发和SQL的灵活性,企业项目中适配性更强。3、MyBatis的核心组件有哪些?各自作用是什么?核心五大组件,面试高频背诵点:1.SqlSessionFactoryBuilder:构造器,负责读取核心配置文件,构建SqlSessionFactory工厂对象,用完即弃,无需常驻内存;2.SqlSessionFactory:会话工厂,全局唯一,单例存在,核心作用是生产SqlSession数据库会话;3.SqlSession:数据库会话,相当于JDBC的Connection,是执行CRUD操作的核心对象,线程不安全,每次请求创建、用完关闭;4.Mapper:数据访问接口,定义数据库操作方法,无实现类,由MyBatis动态代理生成代理对象执行方法;5.MapperXML/注解:存储SQL语句、映射规则,绑定Mapper接口方法,完成参数和结果映射。二、核心原理类(中级必问,考察底层理解)1、MyBatis的执行流程简单说一下?完整执行链路,企业面试标准回答:1.加载MyBatis核心配置文件(mybatis-config.xml)和所有Mapper映射文件;2.SqlSessionFactoryBuilder解析配置信息,创建SqlSessionFactory工厂;3.由SqlSessionFactory创建SqlSession数据库会话;4.SqlSession获取Mapper接口的动态代理对象;5.调用Mapper接口方法,MyBatis根据方法名匹配对应的SQL语句;6.封装方法参数为SQL参数,执行SQL;7.将数据库返回的结果集,按照映射规则封装为Java实体对象并返回;8.关闭SqlSession,释放数据库连接资源。2、MyBatis是如何实现Mapper接口无实现类执行的?核心依靠JDK动态代理机制。1.MyBatis启动时,会扫描所有Mapper接口和对应的XML文件,建立接口方法与SQL语句的映射关系;2.当获取Mapper对象时,框架通过JDK动态代理为Mapper接口生成代理对象(MapperProxy);3.调用接口方法时,触发代理对象的invoke方法,MyBatis根据方法全限定名找到对应的SQL,完成数据库操作;4.全程无需开发者手写实现类,所有数据库操作由代理对象完成。3、#{}和${}的区别?日常开发怎么选择?这是面试必考基础坑点,核心区别三点:1.解析方式不同:#{}是预编译参数占位符,等价于JDBC的?占位符;${}是字符串直接拼接,直接将参数内容拼入SQL;2.防SQL注入:#{}可以有效防止SQL注入,安全性高;${}无法防注入,存在极大安全风险;3.数据处理:#{}会自动给字符串类型加单引号;${}直接原样拼接,不会添加任何符号。开发规范:优先全部使用#{};只有动态排序、动态表名、动态字段这类无法使用占位符的场景,才谨慎使用${},且必须做参数校验。4、MyBatis的一级缓存、二级缓存区别和使用场景?###一级缓存(默认开启)1.作用范围:SqlSession级别,同一个会话内有效;2.生命周期:SqlSession创建时开启,关闭或清空缓存时失效;3.特性:同一SqlSession中,相同SQL和参数的查询,只会访问一次数据库,后续直接读缓存;执行增删改操作后,缓存会自动清空,避免数据脏读。###二级缓存(默认关闭,需手动开启)1.作用范围:Mapper命名空间级别,跨SqlSession有效,全局共享;2.开启方式:全局配置开启缓存,Mapper文件中添加<cache/>标签,实体类实现序列化接口;3.特性:多个会话可共享缓存数据,提升查询效率;增删改后会刷新对应缓存;4.适用场景:查询多、修改少的静态数据(如字典、配置、分类数据),频繁变动的数据不建议使用,易出现数据不一致。三、动态SQL与映射问题(实战高频)1、MyBatis常用的动态SQL标签有哪些?各自用途?动态SQL核心是解决多条件拼接、空值判断、动态遍历问题,常用标签:1.<if>:条件判断,判断参数是否非空,满足条件才拼接SQL片段,最常用;2.<where>:自动处理SQL开头的and/or,自动去除多余前缀,避免语法错误;3.<set>:更新语句专用,自动去除末尾多余逗号,适配动态更新字段场景;4.<foreach>:遍历集合,多用于in查询、批量新增、批量删除;5.<choose>、<when>、<otherwise>:多条件分支选择,类似if-elseif-else,只执行一个满足的条件;6.<trim>:自定义前缀、后缀、截取字符,灵活处理各类SQL拼接问题。2、实体类属性名和数据库字段名不一致,怎么解决?三种主流解决方案,企业开发按需使用:1.全局驼峰命名自动转换:在核心配置文件开启mapUnderscoreToCamelCase=true,数据库下划线字段(user_name)自动映射为Java驼峰属性(userName),最常用、最简洁;2.SQL语句起别名:查询时给字段起别名,让别名和实体类属性名一致,适配临时特殊查询场景;3.resultMap手动映射:自定义ResultMap,绑定数据库字段和实体属性,适配字段差异大、复杂关联查询场景,通用性最强。3、resultType和resultMap的区别?什么时候用resultMap?1.resultType:自动映射,适用于数据库字段和实体属性名完全匹配、简单单表查询,写法简洁,无需手动配置映射关系;2.resultMap:手动自定义映射,支持复杂映射规则。必须用resultMap的场景:①字段名和属性名不一致,且未开启全局驼峰转换;②一对一、一对多关联查询;③需要做字段类型转换、特殊数据处理;④分页、复杂多表查询结果封装。四、实战坑点与优化(高阶面试重点)1、MyBatis常见的开发踩坑点有哪些?整理企业开发最常见的6个坑:1.SQL注入问题:误用${}拼接用户传入参数,导致注入漏洞;2.空值查询失效:<if>标签判断数值类型时,只判断非空,未判断非0,导致0值被过滤;3.多余逗号、and/or语法错误:动态拼接SQL时,未使用<where>、<set>标签,导致SQL语法异常;4.一级缓存数据脏读:同一事务内多次查询,中间数据被修改,缓存未及时刷新导致数据不一致;5.批量操作效率低:普通循环单次新增/修改,未使用<foreach>批量语法或SqlSession批量模式;6.关联查询N+1问题:一对一、一对多关联查询时,先查主表,再循环查询子表,产生大量冗余SQL,性能极差。2、怎么解决MyBatis关联查询的N+1问题?两种主流解决方案,面试直接答核心:1.使用联表查询(优先推荐):通过leftjoin、innerjoin多表联查,一次SQL查询出所有主表、子表数据,从根源避免多次查询;2.开启延迟加载+按需查询:开启全局延迟加载,关联数据仅在使用时才查询,同时配合批量查询,减少SQL执行次数。3、MyBatis批量插入数据有几种方式?优缺点是什么?1.循环单次插入:代码简单,但是每次插入都会创建会话、提交事务,数据库IO频繁,数据量大时性能极差,禁止大批量使用;2.foreach批量插入(XML拼接):一条SQL插入多条数据,IO次数少,性能高,企业最常用;缺点是数据量超大时,SQL语句过长可能超出数据库限制;3.SqlSession批量模式:开启BATCH模式,统一提交事务,批量处理数据,适合超大数据量插入,性能最优,可控性强。4、MyBatis如何进行SQL优化?结合实战的优化手段:1.SQL本身优化:避免select*,只查询所需字段;合理使用索引,避免模糊查询、全表扫描;2.动态SQL优化:精准拼接查询条件,避免无效查询、冗余条件;3.缓存优化:合理利用一级、二级缓存,减少重复查询;高频查询、低频修改数据开启二级缓存;4.解决N+1问题:多表查询优先联表,减少SQL执行次数;5.批量操作优化:摒弃循环单条操作,使用批量语法处理批量增删改;6.分页优化:使用PageHelper分页插件,避免手动分页逻辑冗余,同时防止深分页性能问题。五、SpringBoot+MyBatis整合面试题(项目实战必问)1、SpringBoot整合MyBatis的核心步骤?1.引入mybatis-spring-boot-starter启动依赖和数据库驱动依赖;2.配置application.yml/perties数据库连接参数、驼峰转换、日志打印等配置;3.在启动类添加@MapperScan注解,扫描Mapper接口包;4.编写Mapper接口和对应的XML映射文件,完成CRUD操作。2、@Mapper和@MapperScan的区别?1.@Mapper:作用在单个Mapper接口上,标识该接口为MyBatis数据访问接口,缺点是每个接口都需要手动添加,项目量大时冗余;2.@MapperScan:作用在启动类/配置类上,批量扫描指定包下所有Mapper接口,无需逐个添加@Mapper,企业项目统一使用这种方式,简洁高效。

温馨提示

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

评论

0/150

提交评论