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

下载本文档

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

文档简介

MyBatis常见面试题及详细答案(实战版)一、基础认知类1、什么是MyBatis?它的核心作用是什么?MyBatis是一款开源的轻量级持久层框架,属于半自动ORM框架,专门用于Java程序和数据库之间的数据交互。核心作用:封装了JDBC繁琐的代码,比如手动创建连接、创建Statement、手动设置参数、结果集封装等重复操作,让开发者只需要关注SQL语句本身,大幅简化数据库操作代码。和Hibernate全自动ORM框架不同,MyBatis不会自动生成SQL,SQL由开发者手动编写,灵活性更高,适配复杂业务、多表关联、复杂查询场景,这也是企业项目主流使用MyBatis的核心原因。2、MyBatis和JDBC、Hibernate的区别?1)MyBatisvsJDBCJDBC是原生数据库操作方式,代码冗余度极高,需要手动管理连接、语句、结果集、资源关闭,硬编码SQL,维护困难;MyBatis对JDBC做了封装,自动管理连接和资源关闭,SQL与代码解耦,自动完成结果集和实体类的映射,开发效率更高。2)MyBatisvsHibernateHibernate是全自动ORM框架,完全通过对象操作数据库,自动生成SQL,开发简单,但SQL不可控,复杂查询、多表优化、定制化SQL很难实现,性能调优难度大;MyBatis是半自动框架,SQL手动编写,完全可控,支持动态SQL,适配复杂业务场景,查询性能更好、调优更简单,更适合互联网高并发、复杂业务项目。3、MyBatis的优缺点?优点1、SQL与代码解耦:SQL写在XML或注解中,和业务代码分离,便于统一维护、优化、迭代;2、轻量灵活:无过多冗余配置,上手简单,支持动态SQL,适配各类复杂查询、批量操作;3、自动映射:支持实体类、Map、基本数据类型的结果自动封装,无需手动解析结果集;4、性能优异:底层基于原生JDBC,无过多封装开销,支持SQL优化、分页、缓存,适配高并发场景;5、支持高级特性:动态SQL、延迟加载、事务控制、批量操作、自定义类型处理器等。缺点1、需要手动编写SQL,简单CRUD也需要维护SQL语句,相比全自动框架代码量略多;2、数据库兼容性差,不同数据库的语法差异需要手动适配,无法做到完全跨库;3、多表关联场景需要手动维护关联关系,不如Hibernate便捷。二、核心原理与执行流程4、MyBatis的核心组件有哪些?各自作用?1)SqlSessionFactory(会话工厂)核心工厂类,全局唯一,负责读取MyBatis核心配置文件、映射文件,初始化MyBatis环境,创建SqlSession对象,项目启动时只初始化一次。2)SqlSession(会话)MyBatis核心操作对象,是数据库交互的会话,包含所有增删改查方法,线程不安全,每次数据库操作都需要新建,用完立即关闭。3)MapperProxy(Mapper代理对象)开发者定义的Mapper接口没有实现类,MyBatis通过JDK动态代理生成代理对象,拦截接口方法,匹配对应的SQL语句执行数据库操作。4)Executor(执行器)SQL执行核心,负责调度StatementHandler、ParameterHandler、ResultSetHandler,完成SQL执行、参数设置、结果封装。默认三种类型:SIMPLE(普通执行器)、REUSE(复用预处理语句)、BATCH(批量操作执行器)。5)三大处理器ParameterHandler:负责SQL参数的预处理和赋值;StatementHandler:负责创建Statement、执行SQL;ResultSetHandler:负责将数据库结果集封装为Java对象。5、简述MyBatis完整执行流程?1、项目启动,加载MyBatis全局配置文件和所有Mapper映射文件,解析配置信息、SQL语句、映射规则;2、通过配置信息构建SqlSessionFactory工厂对象,完成全局初始化;3、通过SqlSessionFactory创建SqlSession数据库会话对象;4、SqlSession获取Mapper接口的代理对象MapperProxy;5、调用Mapper接口方法,代理对象拦截方法请求,根据方法全限定名匹配对应的SQL;6、通过Executor执行器,调用三大处理器,完成参数赋值、SQL执行、结果集封装;7、将封装后的Java对象返回,关闭SqlSession,释放数据库资源。6、Mapper接口为什么不需要实现类?MyBatis基于JDK动态代理机制实现,开发者只需要定义Mapper接口和对应的XML/注解SQL。程序调用Mapper接口方法时,MyBatis不会执行接口空方法,而是通过代理工厂生成接口的代理对象,拦截所有接口方法,根据方法的全限定类名+方法名,精准匹配映射文件中的SQL语句,自动执行数据库操作,所以无需手动编写实现类。三、配置与映射问题7、#{}和${}的区别?使用场景分别是什么?1)#{}预编译占位符底层对应JDBCPreparedStatement,会对参数进行预编译,有效防止SQL注入;参数会自动加引号,适合普通参数传递;多次执行相同SQL可复用预编译语句,性能更高。2)${}字符串直接拼接底层直接将参数字符串拼接进SQL语句,无法防止SQL注入,安全性差;不会自动加引号;每次执行都是全新SQL,无法复用预编译结果。使用场景日常普通参数查询、新增、修改、删除,优先使用#{};需要动态传入表名、字段名、排序字段、排序规则(asc/desc)等不能加引号的场景,只能使用${},使用时必须手动做参数校验,防止SQL注入。8、MyBatis实体类属性和数据库字段名不一致怎么解决?实际开发中非常常见,比如数据库下划线命名user_name,实体类驼峰userName,三种解决方案:1)全局开启驼峰自动转换(最常用)在全局配置文件中设置mapUnderscoreToCamelCase=true,自动将数据库下划线字段转为实体类驼峰属性,全局生效,无需逐个配置。2)SQL语句起别名查询SQL中通过as给数据库字段起和实体类一致的别名,直接映射。3)通过ResultMap手动映射自定义ResultMap,手动绑定数据库column字段和实体类property属性,适配复杂字段不一致、多表查询、嵌套映射场景。9、ResultMap和ResultType的区别?ResultType用于简单映射,直接指定返回值类型(实体类、Map、基本类型),要求数据库字段和实体类属性名一致,或者开启驼峰转换,无法自定义映射规则,适合简单单表查询。ResultMap自定义映射规则,支持字段手动匹配、类型转换、一对一、一对多嵌套映射、字段忽略等复杂场景,灵活性极强,适合字段不统一、多表关联、复杂结果封装的场景。ResultMap可以复用,减少重复配置。四、动态SQL相关10、MyBatis常用动态SQL标签有哪些?各自作用?动态SQL是MyBatis核心特性,用于解决多条件动态查询、动态新增修改问题,避免拼接SQL冗余代码:if:条件判断,满足条件则拼接对应SQL片段,常用于动态查询条件;where:自动处理查询条件前缀,去除多余的and/or,无需手动处理空格和连接符;set:用于更新语句,自动去除最后多余的逗号,解决动态更新字段的语法报错问题;foreach:遍历集合,常用于批量新增、批量删除、in查询,支持数组、List集合遍历;choose/when/otherwise:类似switch-case逻辑,多条件互斥匹配,只执行第一个满足的条件;trim:自定义字符串截取、拼接规则,可替代where、set,通用性更强。11、where标签和直接写where1=1的区别?早期开发常用where1=1拼接动态条件,避免无查询条件时报错,但存在索引失效、查询效率降低、代码不规范等问题。MyBatis的where标签会自动识别内部if条件,有条件则自动拼接where关键字,无条件则不生成,同时自动剔除第一个多余的and/or,语法更严谨,不会影响数据库索引,是企业标准写法。12、foreach标签的常用属性和使用场景?核心属性:collection(遍历的集合/数组)、item(遍历单项变量)、open(起始拼接字符)、close(结束拼接字符)、separator(分隔符)。常用场景:in批量查询、批量删除、批量新增数据。需要注意批量操作参数数量限制,避免单次遍历数据量过大导致SQL超长、数据库报错。五、缓存机制(高频面试)13、MyBatis的一级缓存和二级缓存区别?MyBatis提供两级缓存,用于减少重复查询数据库,提升查询性能。一级缓存(本地缓存)1、默认开启,无需手动配置;2、作用域:同一个SqlSession会话内;3、生命周期:SqlSession创建时生效,关闭/清空会话后缓存失效;4、规则:同一会话中,相同查询SQL、相同参数,会直接读取缓存,不查询数据库;会话内执行增删改操作,会自动清空当前一级缓存,防止数据脏读。二级缓存(全局缓存)1、默认关闭,需要手动开启配置;2、作用域:同一个Mapper命名空间下,跨SqlSession会话;3、生命周期:全局生效,项目运行期间持续存在;4、规则:多个会话查询同一Mapper的相同数据,可共享缓存;任意会话执行该命名空间下的增删改操作,会清空该命名空间所有二级缓存;5、要求:实体类必须实现序列化接口Serializable。14、二级缓存的使用步骤和注意事项?使用步骤1、全局配置文件开启二级缓存总开关:settings中配置cacheEnabled=true;2、对应Mapper映射文件中添加<cache/>标签开启当前命名空间缓存;3、查询结果对应的实体类实现Serializable序列化接口。注意事项1、二级缓存适合查询多、修改少的静态数据,频繁更新的业务不建议使用,缓存清空频繁反而影响性能;2、多表关联查询不建议使用二级缓存,容易出现数据不一致;3、事务未提交时,缓存不会生效,避免脏数据。15、什么情况会导致一级缓存失效?1、不同SqlSession会话之间,一级缓存不共享;2、同一个SqlSession内,执行增、删、改操作后,自动清空一级缓存;3、手动调用sqlSession.clearCache()清空缓存;4、查询条件、SQL语句不一致,无法命中缓存。六、事务与延迟加载16、MyBatis的事务管理方式?MyBatis有两种事务管理模式:1)JDBC事务模式底层使用原生JDBC事务,手动控制提交、回滚,默认开启自动提交,适合简单独立项目。2)MANAGED托管事务将事务交给容器(Spring)管理,本身不控制事务提交和回滚,Spring整合MyBatis时默认使用该模式,日常开发基本都是Spring统一声明式事务管理。17、MyBatis延迟加载是什么?适用场景?延迟加载也叫懒加载,针对一对一、一对多关联查询,默认关闭。核心逻辑:查询主表数据时,不立即查询关联的从表数据,只有在使用关联属性时,才会发起二次查询。优点:减少不必要的数据库查询,提升单次查询性能,避免加载冗余数据;适用场景:关联数据量大、不一定需要使用关联字段的场景;缺点:多次查询数据库,若后续必然使用关联数据,会产生多余SQL,反而降低性能。七、常见问题与性能优化18、MyBatis出现过哪些常见报错?如何解决?1)Mapper接口和映射文件不匹配原因:接口方法名、参数、返回值和XML不对应,或namespace绑定错误;解决:核对namespace为接口全限定名,方法名、参数严格匹配。2)SQL语法错误、多余逗号、多余and/or原因:动态SQL拼接异常;解决:使用where、set标签替代手动拼接。3)字段映射异常,找不到对应属性原因:字段名不一致、未开启驼峰转换、ResultMap映射错误;解决:开启驼峰转换或手动配置ResultMap。4)一级缓存脏数据问题原因:同一会话查询后,外部修改数据库数据,缓存未更新;解决:关键业务手动清空缓存或使用二级缓存。19、MyBatis如何进行性能优化?1、合理使用缓存:查询多更新少的业务开启二级缓存,利用一级缓存减少重复查询;2、优化SQL语句:避免select*,只查询需要字段,优化关联查询、子查询;3、合理使用延迟加载:非必要关联数据懒加载,必要数据关闭懒加载避免多次查库;4、批量操作优化:批量新增、删除使用foreach批量语句,避免循环单条操作;5、参数使用#{}预编译,提升性能并防止SQL注入;6、避免大结果集查询,分页查询所有列表数据,防止内存溢出;7、正确使用执行器,批量场景启用BATCH执行器提升批量操作效率

温馨提示

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

评论

0/150

提交评论