版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2年Java经验MyBatis高频面试题及详细答案(实战向)说明:本套面试题适配1-3年Java开发岗位,聚焦日常开发高频使用、面试必问知识点,摒弃晦涩理论,全部结合实战场景解答,贴合企业真实面试节奏。一、基础认知类(必问)1、简单说说你对MyBatis的理解?和JDBC、Hibernate的区别?参考答案:MyBatis是一款轻量级的持久层ORM框架,核心作用是简化JDBC操作,实现数据库和Java实体类的映射。它属于半自动ORM框架,需要自己手写SQL语句,灵活性极高。和JDBC区别:原生JDBC需要手动加载驱动、创建连接、编写预处理语句、手动设置参数、手动封装结果集、关闭资源,代码冗余量大。MyBatis封装了所有重复的资源操作,自动完成参数注入和结果集封装,只需要专注写SQL即可,大幅提升开发效率。和Hibernate区别:Hibernate是全自动ORM框架,完全不用手写SQL,适配简单CRUD,但复杂查询、多表关联、大数据量场景性能差、优化困难。MyBatis半自动,SQL可控,方便优化、适配复杂业务、分页、多表查询,互联网项目基本都用MyBatis。2、MyBatis的核心组件有哪些?各自作用是什么?参考答案:日常开发最常用的五大核心组件,各司其职:1.SqlSessionFactoryBuilder:构建器,专门用来读取MyBatis配置文件,创建SqlSessionFactory工厂对象,用完即弃,无需长期保存。2.SqlSessionFactory:会话工厂,全局单例,整个项目只需要创建一次,核心作用是生产SqlSession对象。3.SqlSession:数据库会话,相当于JDBC的Connection,是执行CRUD操作的核心对象,非线程安全,必须保证每次请求一个新的SqlSession,不能全局共享。4.Mapper接口:开发者自定义的DAO接口,无实现类,通过动态代理生成代理对象执行SQL。5.Mapper映射文件:存放SQL语句、字段映射关系,绑定Mapper接口,实现方法和SQL的关联。3、MyBatis中#{}和${}的区别?开发中怎么选择使用?参考答案:这是开发最常用、面试最高频的知识点,核心区别有三点:1.预编译机制不同:#{}是预编译参数(占位符?),会自动进行类型匹配、字符串拼接,底层用PreparedStatement,安全高效;${}是直接字符串拼接SQL,无预编译,底层用Statement。2.防SQL注入:#{}可以彻底防止SQL注入攻击;${}无法防注入,存在极大安全隐患。3.自动加引号:#{}传入字符串、日期类型,会自动拼接单引号;${}纯原样拼接,不会加任何符号,需要自己手动加引号。使用场景选择:1.普通参数查询、条件传参,一律用#{}(优先);2.动态排序、动态表名、动态字段(如orderby字段、动态分表),必须用${},因为预编译不支持动态修改数据库关键字,使用时要手动校验参数,防止注入。二、核心原理与执行流程4、说说MyBatis的完整执行流程?参考答案:结合开发实操,完整执行步骤如下:1.加载全局配置文件(mybatis-config.xml)和所有Mapper映射文件;2.SqlSessionFactoryBuilder解析配置文件,生成Configuration全局配置对象,包含所有环境、映射、参数配置;3.通过Configuration创建SqlSessionFactory工厂;4.工厂开启SqlSession数据库会话;5.MyBatis通过JDK动态代理,生成Mapper接口的代理对象;6.调用Mapper接口方法,代理对象根据方法名匹配对应的SQL语句;7.执行SQL预编译、参数封装、数据库交互;8.接收数据库返回结果,自动封装为Java实体对象;9.关闭SqlSession,释放数据库连接资源。5、为什么Mapper接口不需要实现类就能运行?底层原理是什么?参考答案:核心是JDK动态代理机制。MyBatis启动时,会扫描所有Mapper接口和对应的XML文件,将接口全限定名、方法名与XML中的SQL语句做绑定缓存。当我们调用Mapper接口的方法时,并不是接口本身在执行,而是MyBatis生成的代理对象(MapperProxy)拦截了方法调用。代理对象会根据当前调用的方法全路径,匹配缓存中对应的SQL,封装参数、执行数据库操作,最后返回结果,所以无需手动编写实现类。三、动态SQL(实战高频)6、MyBatis常用的动态SQL标签有哪些?各自场景?参考答案:动态SQL主要用于解决多条件模糊查询、可选参数查询,避免拼接SQL出错,日常常用6个标签:1.<if>:条件判断,参数不为空时拼接对应SQL,最常用,多用于多条件查询;2.<where>:自动处理查询条件的前缀and/or,自动去除多余的前缀关键字,避免SQL语法错误;3.<set>:用于更新操作,自动去除最后一个多余的逗号,解决动态更新字段的语法问题;4.<foreach>:遍历集合,多用于in查询、批量新增、批量修改,支持数组、List集合;5.<choose><when><otherwise>:类似Java的switch-case,多条件互斥,只执行第一个满足的条件;6.<trim>:自定义字符串截取,可替代where、set标签,灵活去除前后多余的关键字、逗号。7、<where>标签和直接写where1=1的区别?开发中推荐哪种?参考答案:1.where1=1:传统写法,固定拼接恒真条件,后续所有if条件都可加and,不会报错,但存在小问题:SQL语句冗余,且部分数据库优化器会忽略该恒真条件,极少数场景会影响索引命中;2.<where>标签:MyBatis自带优化,只会在有查询条件时才生成where关键字,同时自动剔除第一个多余的and/or,SQL更简洁、规范。开发推荐:优先使用<where>标签,更规范,避免手动拼接出错。8、MyBatis批量插入怎么写?<foreach>的核心参数含义?参考答案:批量插入核心依赖<foreach>标签,核心参数:-collection:遍历的集合类型,List填list、数组填array;-item:遍历的每一个元素别名;-index:遍历下标,非必填;-open:遍历开始拼接的语句;-close:遍历结束拼接的语句;-separator:每个元素之间的分隔符。实战注意点:MySQL默认单次批量插入有长度限制,大批量数据需要分批插入,避免SQL超长报错。四、映射与参数、结果封装9、MyBatis中实体类属性名和数据库字段名不一致怎么解决?参考答案:日常开发三种解决方案,按需使用:1.全局开启驼峰命名自动转换(最常用):在mybatis-config.xml中配置mapUnderscoreToCamelCase=true,数据库下划线字段(user_name)自动映射Java驼峰属性(userName),全局生效,一劳永逸;2.SQL语句起别名:查询时selectuser_nameasuserNamefromuser,临时适配字段,适合少量特殊字段;3.自定义ResultMap映射:手动绑定数据库字段和实体属性,支持复杂类型、一对一、一对多关联映射,适配复杂业务。10、ResultMap和ResultType的区别?什么时候用ResultMap?参考答案:1.ResultType:自动映射,只需要指定实体类全路径,MyBatis自动根据字段名匹配封装,适合简单CRUD、字段名一致的场景,简洁高效;2.ResultMap:手动自定义映射,灵活性极高,支持字段名不一致映射、字段类型转换、一对一、一对多关联查询、嵌套查询。使用场景:简单查询用ResultType,字段不匹配、关联查询、复杂结果封装,必须用ResultMap。11、MyBatis方法入参有几种传递方式?多个参数怎么处理?参考答案:常见四种入参方式:1.单个基本类型参数:直接使用#{参数名}获取;2.多个基本类型参数:必须用@Param注解绑定参数名,否则MyBatis无法识别参数,会报参数异常;3.实体类参数:直接通过#{属性名}获取属性值;4.Map集合参数:通过#{key}获取对应value值,适合零散参数场景。实战规范:3个及以上参数优先用实体类或Map,参数较少用@Param注解,代码更清晰。五、缓存机制(面试重点)12、MyBatis的一级缓存和二级缓存区别?各自特点?参考答案:MyBatis缓存用于减少数据库查询次数,提升性能,分为一级、二级缓存:一级缓存(本地缓存)1.默认开启,无需手动配置;2.作用域:同一个SqlSession内有效;3.失效场景:SqlSession关闭、提交事务、执行增删改操作、手动清空缓存,缓存会立即失效;4.特点:单次会话内重复查询直接读缓存,不查数据库,会话结束缓存销毁。二级缓存(全局缓存)1.默认关闭,需要手动开启(全局配置+Mapper标签开启);2.作用域:跨SqlSession,整个Mapper命名空间下有效,全局共享;3.失效场景:对应Mapper下执行增删改操作,会清空该命名空间所有缓存;4.要求:实体类必须实现序列化接口;5.特点:多会话共享缓存,适合查询多、修改少的静态数据(字典、配置)。13、开发中为什么很少用MyBatis二级缓存?有什么坑?参考答案:实际项目中基本不用二级缓存,核心坑点:1.数据一致性问题:二级缓存是Mapper命名空间隔离的,如果A、B两个Mapper操作同一张表,AMapper修改数据后,只会清空A的缓存,B的缓存不会刷新,导致查询脏数据;2.缓存粒度太粗:只要该命名空间有增删改,所有缓存全部清空,缓存命中率极低;3.项目有Redis缓存冗余:实际开发都会用Redis做全局缓存,MyBatis二级缓存本地缓存作用极小,没必要重复使用。六、实战问题与踩坑总结(2年经验核心考察点)14、MyBatis中传入空字符串和null的区别?会出现什么问题?参考答案:日常开发最常见的动态SQL坑:1.<iftest="name!=null">:只会判断非null,空字符串""会通过判断,拼接空字符串条件,导致查询异常;2.<iftest="name!=nullandname!=''">:同时判断非空、非空字符串,是开发标准写法。坑点总结:只判null不判空字符串,会拼接无效SQL,导致查询结果错误、索引失效,所有字符串参数必须同时判断null和空串。15、MyBatis查询返回null的常见原因有哪些?参考答案:结合实操,常见5种原因:1.数据库字段名和实体属性名不一致,未配置驼峰转换、未写ResultMap映射;2.SQL语句写错,查询字段不存在、表名错误、条件匹配不到数据;3.参数传递错误,多参数未加@Param注解,参数绑定失败;4.实体类无无参构造方法,MyBatis反射无法实例化对象;5.查询结果为null,且未做非空判断,直接返回空对象。16、MyBatis分页怎么做?原生分页和PageHelper分页的区别?参考答案:原生分页:手动在SQL中写limitoffset,pageSize,灵活可控,适配复杂查询,无框架依赖,性能最优,适合复杂业务分页。PageHelper分页插件:基于MyBatis拦截器实现,只需传入页码、页大小,自动拼接分页SQL,无需手写limit,开发效率高,适合简单分页场景。PageHelper踩坑点:分页查询必须紧跟查询语句,中间不能有其他SQL,否则会分页错乱;禁止在循环中使用分页。17、MyBatis的事务是怎么管理的?SqlSession的提交和回滚机制?参考答案:原生MyBatis默认开启手动事务,默认不自动提交事务。1.手动事务:SqlSession默认autoCommit=false,执行增删改后,必须手动调用commit()才会提交数据库,出现异常调用rollback()回滚;2.整合Spring后:由Spring事务管理器统一管理,通过@Transactional注解实现声明式事务,无需手动提交回滚。实战注意:原生MyBatis如果忘记commit,增删改数据不会入库,这是新手最常踩的坑。七、进阶考点(2年晋升必问)18、MyBatis的插件(拦截器)原理?你用过哪些插件?参考答案:MyBatis支持自定义拦截器,底层基于动态代理和责任链模式,可以拦截四大核心对象:Executor、StatementHandler、ParameterHandler、ResultSetHandler。日常开发常用插件:1.PageHelper分页插件(拦截SQL执行,自动拼接分页语句);2.通用Mapper插件(简化单表CRUD,无需手写基础SQL);3.日志打印插件(打印执行SQL、耗时、参数,方便排查问题)。19、MyBatis如何解决SQL注入问题?除了#{}还有什么方案?参考答案:核心解决方案就是使用#{}预编译参数,从根源杜绝SQL注入。如果业务必须使用${}(动态表名、排序),需要额外防护:1.后台手动校验参数白名单,只允许指定字段、表名传入;2.过滤特殊字符(单引号、
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 焙烧炉焙烧工班组安全模拟考核试卷含答案
- 中小企业财务风险预警指标体系构建与应用手册
- 紧固件制造工风险评估水平考核试卷含答案
- 量具制造工岗前竞争考核试卷含答案
- 旅游团队领队安全综合评优考核试卷含答案
- 医院医务部医生工作质量评估表
- 玻璃釉膜电阻器、电位器制造工安全教育考核试卷含答案
- 媒体策划主管品牌宣传推广KPI考核表
- 工业机器人操作工安全标准考核表
- 广告创意团队营销活动效果绩效评定表
- 第3章圆单元检测卷(一)(含答案)苏科版2026-2027九年级数学上册
- 2026-2027学年八年级上册语文1-3单元综合复习试卷
- 大学生突发事件应急预案
- 超声诊断肺静脉异位引流
- 日式枯山水庭院设计方案
- 2025年老年人跌倒防护培训课件
- 豫剧英语介绍
- 2025年地理湖南高考真题及答案
- 《瓦楞纸箱印刷质量高速视觉检测系统》
- 新人教版一年级上册数学全册教案
- GEELY汽车服务顾问课件
评论
0/150
提交评论