版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
MyBatis企业高频面试题及详细真实答案(实战向)一、基础认知类(初级必问)1、什么是MyBatis?它和JDBC、Hibernate的区别是什么?参考答案:MyBatis是一款轻量级的Java持久层框架,核心作用是简化数据库操作,支持自定义SQL、存储过程以及高级映射。它可以自动完成参数封装、结果集映射,大幅减少原生JDBC的冗余代码。和JDBC的区别:原生JDBC需要手动加载驱动、创建连接、编写预处理语句、手动设置参数、手动封装结果集、关闭资源,代码冗余极高。MyBatis封装了这一套流程,我们只需要写SQL和映射规则,框架自动完成资源创建、回收、参数和结果映射。和Hibernate的区别:Hibernate是全自动ORM框架,完全不用写SQL,跨数据库兼容性强,但缺点是SQL可控性差,复杂查询性能不好优化,适合快速开发简单项目。MyBatis是半自动ORM框架,SQL由开发者手动编写,灵活度极高,方便做SQL优化、适配复杂业务查询,互联网企业、中大型项目基本都用MyBatis。2、MyBatis的核心组件有哪些?各自作用是什么?参考答案:一共五大核心组件,面试高频背诵点:1.SqlSessionFactoryBuilder:构造器,专门用来读取配置文件、构建SqlSessionFactory,用完即弃,不需要常驻内存。2.SqlSessionFactory:会话工厂,全局单例,作用是生产SqlSession对象,整个项目只需要创建一次。3.SqlSession:数据库会话,是执行CRUD操作的核心对象,包含了数据库所有操作方法,线程不安全,用完必须关闭。4.Mapper接口:开发者自定义的DAO接口,不需要实现类,通过动态代理生成代理对象执行SQL。5.Mapper映射文件:存放SQL语句、参数映射、结果集映射的XML文件,和Mapper接口一一对应。3、MyBatis中#{}和${}的区别?日常开发怎么选择?参考答案:这是面试最高频的基础题,核心区别在预编译、安全、适用场景:1.#{}:预编译占位符会将参数当成字符串处理,自动添加引号,底层基于JDBCPreparedStatement预编译,有效防止SQL注入,安全性高。支持参数类型自动转换,日常普通条件查询、传参全部用#{}。2.${}:字符串直接拼接直接将参数拼接进SQL语句,没有预编译、没有引号包裹,存在严重的SQL注入风险。${}唯一适用场景:动态传入表名、字段名、排序字段、排序规则(asc/desc),这类场景不能用#{},因为表名加引号会报错。开发规范:能使用#{}绝不使用${},必须用${}的场景,要手动做参数校验过滤,防止注入攻击。4、MyBatis的ORM映射原理是什么?参考答案:ORM就是对象关系映射,简单说就是数据库表字段和Java实体类属性的自动绑定。MyBatis执行SQL拿到数据库ResultSet结果集后,会通过反射机制实例化实体类对象,再根据映射配置(默认驼峰命名匹配、或自定义resultMap),将结果集中的字段值一一赋值给实体类对应的属性,最终返回实体对象或集合。如果数据库字段和实体属性名不一致,可以通过开启驼峰命名自动转换、或者自定义resultMap手动映射解决。二、核心原理与执行流程(中级必问)1、简单说一下MyBatis的完整执行流程?参考答案:1.加载MyBatis全局配置文件和所有Mapper映射文件,解析配置信息、SQL语句、映射规则;2.通过SqlSessionFactoryBuilder创建SqlSessionFactory工厂对象,初始化全局配置环境;3.由SqlSessionFactory创建SqlSession数据库会话对象;4.SqlSession通过动态代理,生成Mapper接口的代理对象;5.调用Mapper接口方法,框架根据方法名匹配对应的SQL语句;6.完成参数解析、SQL预编译、执行数据库操作;7.封装结果集映射为Java对象,返回结果;8.关闭SqlSession,释放数据库连接资源。2、MyBatisMapper接口为什么不需要实现类?底层原理是什么?参考答案:核心底层是JDK动态代理。MyBatis启动时会扫描所有Mapper接口和对应的XML文件,建立接口方法和SQL语句的映射关系。当我们调用Mapper接口的方法时,SqlSession会通过JDK动态代理为Mapper接口生成一个代理对象,由代理对象拦截方法调用,根据全限定类名+方法名找到对应的SQL,执行数据库操作,不需要开发者手动写实现类。简单说:接口绑定SQL,代理执行方法。3、MyBatis的SqlSession是线程安全的吗?为什么?参考答案:SqlSession线程不安全,绝对不能全局共享。因为SqlSession内部包含数据库连接、事务、数据缓存等线程独占资源,多个线程同时使用同一个SqlSession会出现连接混乱、事务错乱、数据覆盖等问题。正确使用规范:每次数据库操作创建一个新的SqlSession,使用完毕立即关闭。Spring整合MyBatis后,会自动管理SqlSession,通过事务保证线程隔离,开发者不用手动创建和关闭。4、MyBatis全局配置文件中,settings常用配置有哪些?参考答案:日常开发最常用的四个配置:1.mapUnderscoreToCamelCase:开启驼峰命名自动转换,数据库user_name字段自动映射实体userName属性,开发必开。2.logImpl:配置SQL日志输出,开发环境打印执行的SQL、参数、耗时,方便调试。3.defaultPageSize:设置默认分页条数,按需配置。4.cacheEnabled:全局开启或关闭二级缓存,默认开启。三、缓存机制(面试重点)1、MyBatis的一级缓存和二级缓存区别?各自特点?参考答案:一级缓存(本地缓存)1.默认开启,无需手动配置,是SqlSession级别的缓存;2.生命周期和SqlSession一致,同一个SqlSession内,执行相同的查询SQL,会走缓存,不会重复查库;3.缓存失效场景:SqlSession关闭、提交事务、执行增删改操作、手动清空缓存,一级缓存都会清空;4.只针对单次会话有效,跨会话无法共享。二级缓存(全局缓存)1.默认关闭,需要手动开启,是Mapper级别的缓存,跨SqlSession共享;2.生命周期跟随整个应用,只要项目不重启、不手动清空,缓存会一直存在;3.开启条件:全局配置开启缓存、Mapper文件添加<cache/>标签、实体类实现序列化接口;4.失效场景:对应Mapper执行增删改操作后,自动清空该Mapper下的所有二级缓存。2、MyBatis缓存查询顺序是什么?参考答案:查询执行优先级:二级缓存→一级缓存→数据库先查二级缓存,有数据直接返回;没有则查一级缓存,有数据返回;都没有才会执行SQL查询数据库,查询结果会同时存入一级和二级缓存。3、生产环境中为什么不建议过度使用MyBatis二级缓存?参考答案:1.二级缓存是Mapper粒度,一旦执行增删改,会清空整个Mapper的缓存,命中率低;2.多表关联查询时,不同Mapper操作同一张表,会出现缓存数据不一致问题;3.分布式环境下,MyBatis二级缓存是本地缓存,无法跨服务共享,会出现各服务缓存数据不同步;4.实际开发中,统一用Redis、Memcached等分布式缓存替代二级缓存,更稳定、可控性更强。四、动态SQL与实战考点(高频)1、MyBatis常用动态SQL标签有哪些?各自作用?参考答案:动态SQL核心是解决多条件模糊查询、非空判断、动态拼接SQL问题,常用标签:1.if:单条件判断,判断参数是否非空,满足条件才拼接SQL片段;2.where:自动处理where关键字,自动去除多余的and/or,解决多条件拼接的语法错误;3.choose/when/otherwise:类似switch-case,多条件互斥,只会执行第一个满足的条件;4.set:更新操作专用,自动去除最后多余的逗号,避免SQL语法报错;5.foreach:遍历集合,常用于in查询、批量新增、批量修改;6.trim:自定义截取前缀、后缀,通用性最强,可替代where、set标签。2、foreach标签的常用属性?批量操作注意事项?参考答案:核心属性:collection(集合参数名)、item(遍历单个元素)、open(拼接开头)、close(拼接结尾)、separator(分隔符)。生产注意点:批量in查询时,集合数据量过大(超过1000条)会导致SQL超长、性能暴跌,甚至报错,必须做分批处理;批量新增建议控制单次条数,提升数据库执行效率。3、resultType和resultMap的区别?什么时候必须用resultMap?参考答案:1.resultType:自动映射,适用于数据库字段和实体类属性名一致、简单单表查询,直接指定实体类全限定名即可,简洁方便。2.resultMap:手动自定义映射,功能更强。必须使用resultMap的场景:①数据库字段和实体属性名不一致,且未开启驼峰转换;②多表关联查询,需要映射关联对象、集合对象;③需要做字段类型转换、特殊数据处理;④一对多、多对多复杂映射场景。五、Spring整合MyBatis考点1、Spring整合MyBatis的核心配置类/组件是什么?参考答案:1.SqlSessionFactoryBean:整合核心,替代原生SqlSessionFactory,加载配置文件、数据源、Mapper文件;2.MapperScannerConfigurer:扫描Mapper接口包,自动生成代理对象,注入Spring容器;3.数据源DataSource:配置数据库连接参数,交由Spring管理。2、为什么整合Spring后不需要手动关闭SqlSession?参考答案:Spring通过事务管理器自动管理SqlSession的生命周期。方法执行前创建SqlSession,方法执行完毕、事务提交或回滚后,Spring会自动关闭SqlSession、释放数据库连接,无需开发者手动操作,同时保证线程安全。六、常见坑点与性能优化(高级必问)1、MyBatis常见的开发坑点有哪些?参考答案:1.SQL注入问题:滥用${}导致注入漏洞,动态表名未做参数校验;2.缓存数据不一致:二级缓存跨Mapper更新数据,导致缓存脏数据;3.foreach批量参数过长:in查询参数过多,触发数据库SQL长度限制报错;4.Null值映射异常:未配置jdbcType,部分数据库传null参数报错;5.多条件拼接多余and/or:未使用where标签,手写where条件导致语法错误;6.事务失效:SqlSession手动操作、方法非public导致事务不生效。2、MyBatis性能优化方案有哪些?参考答案:1.SQL优化:避免select*,只查询需要的字段;合理加索引、避免复杂子查询;2.分页优化:大数据量禁止深分页,避免limit100000,10这类低效分页;3.批量操作优化:使用foreach批量新增/修改,替代循环单条操作;控制单次批量数据量;4.关闭无用缓存:复杂多表查询场景关闭二级缓存,防止脏数据;5.参数优化:非空参数校验,减少无效SQL查询;6.开启日志监控:开发环境打印SQL,及时发现慢查询,配合数据库慢日志优化。3、MyBatis如何解决一对多查询的N+1问题?参考答案:N+1问题就是:先查询N条主数据,再循环查询每条主数据对应的从数据,总共执行N+1次SQL,性能极差。解决方案:1.使用联表左连接查询,通过resultMap一次性映射一对多数据,只执行1次SQL;2.开启MyBatis延迟加载,按需加载关联数据,避免无效查询。七、拓展面试压轴题1、MyBatis的插件原理(拦截器原理)了解吗?参考答案:MyBatis插件基于动态代理和责任链模式实现,可以拦截四大核心对象的方法:Executor、StatementHandler、ParameterHandler、ResultSetHandler。日常使用的分页插件、SQL性能监控插件、乐观锁插件,都是基于MyBatis拦截器实现。插件可以在SQL执行前后做自定义
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年育婴员(婴幼儿护理与行为引导)试卷及答案
- 2025年院感知识竞赛题库(附答案)
- 2025年职业病防治专业常识考核试题及答案解析
- 2025年执业医师定期考核真题库含答案
- 2025年主管护师《专业实践能力》新版真题卷(附每题答案)
- 2026年湖南省“安全生产月”知识竞赛竞答试题及参考答案
- 2026版多发性骨髓瘤诊疗管理指南培训试题及答案
- 山东省济南市第一中学九年级化学第5章模拟试卷及答案
- 2026年湖南省湘教版初中生物四年级下册第11单元生物进化练习题及答案
- 2026供应链金融发展分析及创新模式与投资机会研究报告
- 二手房买卖合同范本下载可打印
- 《西式烹饪工艺》课件-炸薯条
- 工业设计专业职业生涯规划
- 青岛版 小学 信息技术 四年级下册 课程纲要 学历案
- 工业设计技术-Geomagic Design X 逆向设计实用教程 课件 项目5、6 遥控器建模、连杆建模
- 自有房产未取得不动产权属证书证明
- 桥梁现浇箱梁模板支架验收记录表
- 第九章分类系统与进化谱系
- 九年级上册反比例函数作业设计
- GB/T 36129-2018珠宝玉石鉴定阴极发光图像法
- GB/T 13452.2-2008色漆和清漆漆膜厚度的测定
评论
0/150
提交评论