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

下载本文档

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

文档简介

MyBatis高频面试题及详细真实答案(实操版)一、基础认知类(入门必问)1.简单说说你对MyBatis的理解?和JDBC、Hibernate区别是什么?参考答案:MyBatis是一款轻量级的半自动ORM持久层框架,底层封装了JDBC,简化了数据库操作,不用手动写重复的连接、关闭资源、预处理参数等冗余代码。核心特点:SQL与代码分离,SQL写在XML/注解里,灵活度高,适配复杂SQL、多表关联、动态查询。和JDBC区别:JDBC是原生数据库操作方式,代码冗余极高,需要手动管理连接、Statement、结果集、关闭资源;MyBatis封装了这些流程,自动完成参数映射、结果集封装、资源释放。和Hibernate区别:Hibernate是全自动ORM,完全不用写SQL,开发快但SQL可控性差,复杂查询、性能调优麻烦;MyBatis半自动,开发者自己写SQL,可控性强、调优方便、适配互联网高并发场景,这也是现在企业主流用MyBatis的原因。2.MyBatis的核心组件有哪些?各自作用是什么?参考答案:SqlSessionFactory(会话工厂):核心工厂类,全局单例,负责读取配置文件、创建SqlSession,整个项目只初始化一次。SqlSession(会话):数据库操作会话,包含所有增删改查方法,线程不安全,每次请求创建、用完关闭。Mapper接口+MapperXML:数据访问接口,不用写实现类,MyBatis动态生成代理对象,绑定SQL语句。Executor(执行器):SQL执行核心,默认SIMPLE,还有REUSE、BATCH模式,负责执行SQL、处理缓存。ParameterHandler:负责SQL参数预处理、参数类型映射赋值。ResultSetHandler:负责查询结果集封装,把数据库结果映射成Java对象。3.MyBatis中#{}和${}的区别?项目中怎么用?参考答案:这是面试高频坑点,核心区别两点:预编译防注入、取值方式不同。1.#{}:预编译占位符(推荐99%场景)会生成?占位符,走JDBC预编译机制天然防止SQL注入自动给字符串加引号,适配数字、字符串等所有参数2.${}:直接字符串拼接(慎用)直接把参数拼接到SQL中,无预编译存在严重SQL注入风险不会自动加引号使用场景:日常查询、条件参数全部用#{};只有动态排序、动态传表名、动态字段这类无法用占位符的场景,才用${},且必须做参数校验过滤。二、动态SQL高频考点4.MyBatis常用的动态SQL标签有哪些?各自场景?参考答案:动态SQL核心是解决多条件拼接、避免多余and/or、空参数无效查询问题。<if>:最常用,单条件判断,参数非空才拼接SQL,用于普通查询条件。<where>:自动去除首个多余的and/or,不用手动处理拼接语法错误,替代手写where1=1。<set>:更新操作专用,自动去除最后多余的逗号,解决动态更新字段逗号冗余问题。<choose><when><otherwise>:多条件互斥,类似if-elseif-else,只会命中一个条件。<foreach>:遍历集合,常用于in查询、批量新增、批量修改,支持数组、List。<trim>:自定义截取前缀后缀,通用性最强,可以替代where、set标签。5.<foreach>标签常用属性?批量查询怎么写?参考答案:核心属性:collection:集合参数名,List填list,数组填array,自定义参数填对应参数名item:遍历每一项的变量名open:遍历开始拼接的字符,比如(close:遍历结束拼接的字符,比如)separator:遍历中间分隔符,比如逗号最常用场景:in批量查询、批量插入。实际开发中批量新增比循环单条save性能高很多。三、缓存机制(必问核心)6.MyBatis一级缓存、二级缓存区别?失效场景有哪些?参考答案:MyBatis缓存分两级,一级缓存默认开启,二级缓存默认关闭。(1)一级缓存(本地缓存)作用域:同一个SqlSession内机制:同一会话中,相同SQL、相同参数的查询,直接读缓存,不查数据库失效场景:SqlSession关闭、执行增删改操作、手动clearCache()、查询条件变化(2)二级缓存(全局缓存)作用域:同一个Mapper命名空间下,跨SqlSession开启方式:全局配置开启、Mapper文件配置cache标签、实体类实现序列化接口数据流程:查询先查二级缓存,没有再查一级缓存,最后查数据库失效场景:当前namespace下执行增删改,会清空该命名空间所有二级缓存实际开发建议:二级缓存坑较多,分布式项目一般不用,改用Redis统一缓存,避免多会话数据不一致。7.为什么实体类要实现Serializable序列化?参考答案:主要是为了二级缓存和分布式存储。MyBatis二级缓存会将对象序列化后存储,需要实体类实现Serializable接口,否则缓存存取会报错。本地单服务不开启二级缓存可以不实现,但企业开发规范统一所有实体类都实现序列化。四、映射与参数问题(高频踩坑)8.MyBatis字段名和属性名不一致怎么解决?参考答案:三种常用解决方案,项目中最常用前两种:全局开启驼峰命名自动转换(最常用)SQL查询时起别名,让别名和实体类属性名一致手动配置ResultMap映射关系全局配置驼峰转换后,数据库下划线字段(user_name)自动映射Java驼峰属性(userName),不用重复配置,开发效率最高。9.ResultType和ResultMap的区别?参考答案:resultType:直接指定返回实体类、基本类型,适合字段名和属性名一致、简单映射,写法简单快捷。resultMap:自定义映射规则,适合字段属性不一致、嵌套查询、一对一/一对多关联、字段类型转换场景,功能更强、更灵活。简单查询用resultType,复杂关联、特殊映射必须用resultMap。10.Mapper接口方法参数多个时,为什么必须加@Param?参考答案:MyBatis3.4.2之后,单个参数可以不用@Param,但是多个参数必须加@Param绑定参数名。不加的话,MyBatis无法识别参数对应关系,只能用默认的arg0、arg1、param1、param2取值,容易报错、可读性极差。项目规范统一:多参数必须用@Param显式绑定。五、执行原理与底层(进阶面试)11.说说MyBatis的执行流程?参考答案:(口语化流程,面试直接背)1.项目启动加载MyBatis全局配置文件和所有Mapper文件;2.通过SqlSessionFactoryBuilder构建SqlSessionFactory,初始化全局配置、映射关系、缓存配置;3.业务代码获取SqlSession会话;4.MyBatis通过JDK动态代理生成Mapper接口的代理对象;5.调用Mapper方法时,代理对象拦截方法,解析方法对应的SQL、参数;6.Executor执行器执行SQL,先查缓存,没有则执行数据库查询;7.ResultSetHandler封装结果集为Java对象,返回结果;8.关闭SqlSession,释放资源。12.MyBatisMapper接口为什么不用写实现类?参考答案:核心是JDK动态代理。MyBatis启动时会扫描所有Mapper接口,注册到MapperRegistry中。当程序调用Mapper接口方法时,MyBatis会生成接口的代理对象,由代理对象拦截方法调用,根据接口方法名、参数匹配对应的XMLSQL,自动完成数据库操作,所以不需要手动写实现类。六、常见问题与性能优化(面试加分项)13.MyBatis常见的坑有哪些?参考答案:结合实际开发踩坑总结:误用${}导致SQL注入漏洞;动态SQL不加<where>,出现多余and/or导致SQL语法报错;更新操作不写<set>,末尾多余逗号报错;多个参数不加@Param,参数绑定异常;一级缓存导致同一会话脏数据,数据更新后未刷新缓存;批量操作使用循环单条插入,性能极差;开启二级缓存导致分布式环境数据不一致。14.MyBatis如何优化查询性能?参考答案:尽量写精准SQL,避免select*,只查询需要字段,减少IO和内存占用;大批量数据查询使用分页、流式查询,避免一次性加载全部数据导致OOM;批量操作使用<foreach>批量新增/修改,替代for循环单条操作;合理使用索引,SQL避免失效索引(like%xx、函数操作、隐式转换);复杂多表关联尽量拆分SQL,避免大表联查;高并发场景禁用二级缓存,用Redis替代,保证数据一致性;开启SQL日志监控,慢SQL及时优化。15.MyBatis的BATCH执行器有什么用?参考答案:普通SIMPLE执行器每一条SQL都会直接提交数据库,频繁库操作性能差。BATCH模式会缓存多条SQL,统一批量提交,减少数据库交互次数,大幅提升批量新增、修改的性能。注意:BATCH模式需要手动commit,否则数据不落地。七、SpringBoot+MyBatis整合考点16.SpringBoot整合MyBatis核心配置是什么?参考答案:核心就三点:引入mybatis-spring-boot-starter依赖;配置数据

温馨提示

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

评论

0/150

提交评论