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

下载本文档

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

文档简介

MyBatis高频面试题及真实面试版答案一、基础认知类1.什么是MyBatis?和JDBC、Hibernate有什么区别?答案:MyBatis是一款轻量级的半自动ORM持久层框架,底层封装了JDBC,简化了数据库操作,核心是SQL可控、灵活、轻量。三者区别:JDBC:最原生,需要手动写连接、预编译、设置参数、关闭资源,代码冗余量大,重复代码多。Hibernate(全自动ORM):不用写SQL,框架自动生成,开发快,但SQL不可控,复杂查询、多表关联、性能调优很麻烦,重量级框架。MyBatis(半自动ORM):实体和数据库映射由框架处理,SQL自己手写,兼顾开发效率和灵活性,适配复杂业务、海量数据场景,轻量、易优化。2.MyBatis的核心工作流程是什么?答案:整体流程很简单,面试直接按这个说就行:读取MyBatis全局配置文件(mybatis-config.xml)和Mapper映射文件;构建SqlSessionFactory工厂对象,初始化环境、映射关系、插件等;通过工厂获取SqlSession对象(数据库会话);SqlSession根据Mapper接口/StatementID找到对应的SQL;执行SQL、处理参数映射、结果集封装;关闭SqlSession,释放资源。3.MyBatis中SqlSession、SqlSessionFactory、Mapper的关系?答案:SqlSessionFactory:全局唯一,单例,负责生产SqlSession,初始化只执行一次;SqlSession:线程不安全,一次数据库请求一个会话,用完关闭,不能多线程共享;Mapper接口:只是一个代理接口,没有实现类,MyBatis通过动态代理生成实现,调用接口方法本质就是执行对应Mapper文件的SQL。二、核心原理与映射4.MyBatis实体类属性和数据库字段名不一致怎么解决?答案:日常开发三种常用方式,优先用前两种:全局开启驼峰命名自动转换(最常用):在核心配置文件开启mapUnderscoreToCamelCase=true,数据库user_name自动映射实体userName;Mapper文件中手动起别名:selectuser_nameasuserNamefromuser;配置ResultMap映射:手动绑定字段和实体属性,适合字段多、映射复杂的场景。5.ResultMap和ResultType的区别?答案:resultType:直接指定返回实体类、基本类型、集合,适合简单映射,自动映射字段和属性,不能自定义映射规则;resultMap:自定义映射规则,支持复杂映射,可以解决字段属性不一致、一对一、一对多关联查询、嵌套查询等复杂场景;简单查询用resultType,关联、复杂映射必须用resultMap。6.MyBatis如何实现一对一、一对多关联查询?答案:核心靠resultMap的两个标签:一对一:使用<association>标签,比如用户和用户详情,单条关联数据;一对多:使用<collection>标签,比如班级和学生、订单和订单明细,多条集合数据;两种查询方式:嵌套结果查询(单条联表SQL)、嵌套子查询(先查主表再查从表),日常优先联表查询,减少SQL次数。三、动态SQL高频考点7.MyBatis常用动态SQL标签有哪些?各自作用?答案:动态SQL就是根据参数动态拼接SQL,避免空参数导致的语法错误,常用标签:if:条件判断,参数不为空才拼接SQL(最常用);where:自动去除多余的and/or,解决多条件查询前缀多余符号问题;trim:自定义截取前后多余字符,功能比where更灵活;set:更新语句专用,自动去除最后多余的逗号;foreach:遍历集合,多用于in查询、批量新增/修改;choose/when/otherwise:类似switch-case,多条件互斥,只走一个条件;include/sql:抽取通用SQL片段,复用代码。8.where标签和直接写where1=1有什么区别?答案:早期很多人用where1=1拼接条件,但是有弊端,现在项目基本统一用where标签。where1=1:可以拼接任意条件,但是会导致索引失效,影响查询性能;where标签:智能处理,有条件才生成where关键字,自动剔除开头多余的and/or,性能更好,代码更规范。9.foreach批量操作需要注意什么坑?答案:批量in查询时,集合参数为空会报错,必须提前判空;批量新增数据量过大不要一次性遍历,建议分批插入(比如100条一批),避免SQL超长、数据库超时;open、close、separator必须写对,防止SQL语法错误。四、缓存机制(面试高频)10.MyBatis一级缓存、二级缓存区别?答案:一级缓存(默认开启)级别:SqlSession级别,同一个会话内有效;范围:单次请求、同一个SqlSession查询相同SQL,直接读缓存,不查数据库;失效场景:SqlSession关闭、手动清空缓存、执行增删改操作,缓存会清空;问题:多线程、多会话无法共享缓存。二级缓存(默认关闭)级别:Mapper命名空间级别,全局共享;范围:不同SqlSession、同一Mapper下的查询可以共享缓存数据;开启条件:全局配置开启、Mapper文件配置cache、实体类实现序列化接口;失效场景:当前命名空间下执行增删改,缓存整体清空。11.工作中会用MyBatis二级缓存吗?为什么?答案:实际项目中基本不用原生二级缓存。原因:原生二级缓存粒度太粗,是整个namespace缓存,单表更新清空所有缓存,命中率极低;多表关联查询、跨Mapper操作时,会出现缓存数据不一致问题;生产环境一般用Redis做全局缓存,替代MyBatis二级缓存,更可控、更稳定。五、事务与动态代理12.MyBatis的事务默认是什么级别?答案:MyBatis本身事务依赖数据库,默认和MySQL一致,是可重复读。单独使用MyBatis时,默认手动提交事务,需要手动执行commit;整合Spring后,由Spring事务管理,默认传播机制是REQUIRED。13.Mapper接口没有实现类,为什么可以直接注入调用?答案:核心是JDK动态代理。项目启动时,MyBatis会扫描所有Mapper接口,通过动态代理自动生成接口的代理对象,交给Spring容器管理。我们@Autowired注入的其实是代理对象,调用方法时,代理对象会去匹配Mapper文件中的SQL并执行。六、常见坑与性能优化14.MyBatis#{}和${}的区别?(必问)答案:#{}:预编译占位符,底层是PreparedStatement,可以防止SQL注入,参数自动加引号,日常传参优先全部使用#{};${}:字符串直接拼接,底层Statement,无法防SQL注入,不会自动加引号;${}唯一使用场景:动态排序、动态表名、动态字段,这类无法用预编译占位符的场景。15.MyBatis模糊查询怎么写?有什么坑?答案:三种写法,推荐第一种:推荐:#{param}拼接%,直接在Java代码拼接好模糊参数,安全无注入风险;mysql函数concat('%',#{name},'%'),适配性好;不推荐:${}拼接模糊查询,存在SQL注入漏洞。16.MyBatis分页怎么做?原生分页有什么问题?答案:日常开发两种方式:原生分页:直接在SQL末尾加limit,简单方便,但是需要自己写总条数count语句,分页代码冗余;PageHelper分页插件:项目主流用法,只需一行代码开启分页,自动拦截SQL、生成count、封装分页结果,高效简洁。原生最大问题:只查limit数据,不处理总页数、总条数,手动封装麻烦,复杂分页场景容易出错。17.MyBatis常见性能优化手段?答案:避免使用select*,按需查询字段,减少IO传输;合理使用索引,避免动态SQL导致索引失效;批量操作分批处理,禁止一次性超大集合foreach;关联查询优先联表,少用嵌套子查询,减少SQL次数;关闭不必要的日志输出,减少打印开销;大数据量查询开启流式查询,避免一次性加载全部数据导致OOM。18.MyBatis出现数据为空、映射失败的常见原因?答案:数据库字段和实体属性名不一致,未开启驼峰转换、未配置别名/resultMap;查询字段写错、大小写问题(Linux数据库区分大小写);实体类没有无参构造方法;SQL本身查询无数据,参数传递错误;开启了二级缓存,缓存脏数据导致查询数据异常。七、高阶面试题19.MyBatis插件原理?用过哪些插件?答案:MyBatis插件基于责任链模式,通过拦截器拦截四大核心对象:Executor、StatementHandler、ParameterHandler、ResultSetHandler。工作中常用插件:PageHelper分页插件;通用Mapper插件,简化单表CRUD;SQL性能监控插

温馨提示

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

评论

0/150

提交评论