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

下载本文档

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

文档简介

iBatis高频面试题及详细答案(实战版)一、基础概念类1、什么是iBatis?它的核心定位是什么?iBatis是一款轻量级半自动ORM持久层框架,专注于数据库数据和Java对象的映射绑定。核心定位:介于JDBC原生操作和全自动ORM框架(Hibernate)之间。既规避了原生JDBC大量冗余代码、手动封装结果集的繁琐,又不会像Hibernate那样高度封装、黑盒化,开发者可完全掌控SQL语句,适配复杂业务、多表关联、动态SQL场景,灵活性极高。2、iBatis和Hibernate的核心区别?面试高频对比1)ORM模式不同:iBatis是半自动ORM,SQL由开发者手动编写;Hibernate是全自动ORM,框架自动生成SQL。2)可控性不同:iBatis完全掌控SQL,便于优化、适配复杂查询、存储过程;HibernateSQL自动化程度高,复杂SQL编写难度大,调优成本高。3)性能场景不同:简单CRUDHibernate效率更高;复杂业务、大数据量、多条件动态查询,iBatis性能和适配性更好。4)学习成本不同:iBatis上手简单,基于原生SQL思维;Hibernate需掌握缓存、级联、HQL等专属特性,学习成本更高。5)数据库适配:Hibernate跨数据库兼容性强,可无缝切换数据库;iBatis手写SQL,切换数据库可能需要微调语句。3、iBatis和MyBatis的关系是什么?MyBatis是iBatis的升级版,是Apache基金会将iBatis迁移后的全新版本,核心原理、核心用法一脉相承,但做了大量优化和重构。核心区别:1)iBatis配置繁琐,大量依赖xml全局配置;MyBatis简化配置,支持注解开发,轻量化程度更高。2)iBatis动态SQL语法老旧,功能有限;MyBatis优化了动态SQL标签,语法更简洁、功能更强大。3)iBatis事务、缓存机制简单;MyBatis完善了缓存、插件、拦截器机制,扩展性更强。4)iBatis现已停止维护,企业主流使用MyBatis,但底层核心映射逻辑完全兼容。二、核心原理与工作流程4、简单说一下iBatis的核心工作原理?iBatis核心核心是SQL语句与Java对象的双向映射,整体流程清晰:1)加载全局配置文件和Mapper映射文件,解析配置参数、数据库连接信息、映射关系;2)构建SqlMapClient核心会话工厂,用于生成数据库操作会话;3)开发者调用API传入参数对象,框架根据映射文件拼接、解析动态SQL;4)通过原生JDBC执行SQL,获取数据库结果集;5)根据映射规则,自动将结果集封装为Java对象返回;6)自动关闭资源、回收连接,简化原生JDBC资源操作。5、iBatis的核心核心组件有哪些?各自作用?1)SqlMapConfig.xml:全局核心配置文件,配置数据库连接、事务、缓存、映射文件路径等全局参数。2)Mapper映射文件(*.xml):核心文件,定义SQL语句、参数映射、结果集映射,是SQL与实体类绑定的核心载体。3)SqlMapClientFactoryBean:会话工厂bean,用于创建SqlMapClient实例,统一管理数据库会话。4)SqlMapClient:核心操作会话,提供增删改查所有API,是程序操作数据库的入口。5)参数映射(parameterMap):定义Java入参与SQL占位符的映射关系。6)结果映射(resultMap):定义数据库字段与Java实体属性的映射关系,解决字段名和属性名不一致问题。6、iBatis完整执行流程(面试精简版)第一步:读取并解析SqlMapConfig全局配置,加载所有Mapper映射文件;第二步:初始化SqlMapClient工厂,创建数据库连接池、事务管理器;第三步:业务层调用SqlMapClient的CRUD方法,传入参数;第四步:框架解析Mapper中的SQL,替换动态条件、绑定入参;第五步:JDBC执行SQL,查询/更新数据库;第六步:通过resultMap完成结果集与实体类的映射封装;第七步:释放数据库连接,返回结果。三、映射与语法细节7、iBatis中resultMap和resultClass的区别?1)resultClass:直接指定返回实体类的全路径,框架自动根据字段名和属性名自动映射,要求数据库字段名和实体属性名一致,无法自定义映射规则,适合简单查询。优点:配置简单、代码简洁;缺点:灵活性差,不支持字段与属性名不一致、不支持嵌套对象映射。2)resultMap:手动定义映射规则,自定义数据库字段与实体属性的对应关系,支持字段别名、类型转换、一对一、一对多嵌套映射。优点:适配复杂场景、复用性高、解耦性好;缺点:配置稍繁琐。核心使用原则:简单CRUD用resultClass,字段不匹配、关联查询、复杂映射必须用resultMap。8、iBatis的parameterClass和parameterMap区别?1)parameterClass:指定入参类型,支持基本类型、实体类、Map,框架自动绑定参数,配置简单,日常开发最常用。2)parameterMap:手动定义入参的映射规则,可指定参数类型、长度、默认值,适配多复杂参数、存储过程入参场景。现状:实际开发中parameterMap使用率极低,基本被parameterClass替代,仅老旧项目存储过程场景会用到。9、iBatis动态SQL有哪些常用标签?作用分别是什么?iBatis动态SQL核心是智能拼接查询条件,避免多余and/or语法错误,常用标签:1)isEqual:判断参数等于指定值,拼接对应SQL;2)isNotEqual:判断参数不等于指定值;3)isNotNull、isNull:判断参数是否为空,最常用做非空条件判断;4)isGreaterThan、isLessThan:数值大小比较,用于范围查询;5)iterate:遍历集合参数,用于in多值查询、批量插入场景。注意:iBatis动态标签语法偏老旧,没有MyBatis的if、where、trim标签简洁,需要手动处理SQL拼接的前缀后缀问题。10、iBatis中#和$的区别?面试必问1)#{}:预编译占位符,底层对应JDBCPreparedStatement,参数会被预编译、防SQL注入,自动处理字符串引号、转义字符,安全性高,日常参数查询优先使用。2)${}:字符串直接拼接,底层直接将参数拼入SQL语句,无预编译、存在SQL注入风险,不会自动拼接引号。使用场景:#{}:普通条件查询、参数匹配、数值、字符串参数;${}:动态排序字段、动态表名、数据库关键字传递,必须手动做参数校验防注入。四、缓存与事务11、iBatis的缓存机制有哪些?区别是什么?iBatis提供一级缓存(本地缓存)和二级缓存(全局缓存)。1)一级缓存:默认开启,基于SqlMapClient会话级别,同一会话中,相同查询SQL和参数,会缓存结果,避免重复查询数据库。会话关闭后,缓存自动清空。特点:线程私有、生命周期短、无需手动配置。2)二级缓存:需要手动开启,基于Mapper映射文件级别,全局共享,跨会话、跨请求生效,缓存数据可被多个会话复用。特点:全局共享、生命周期长、可配置过期策略,适合高频查询、低频修改的静态数据(字典、配置参数)。注意:增删改操作会自动清空对应缓存,避免数据脏读。12、iBatis事务管理方式有几种?1)JDBC事务:依赖原生JDBC事务,通过Connection实现手动提交、回滚,适合简单项目。2)Spring托管事务:企业主流用法,将iBatis整合Spring,通过SpringAOP实现声明式事务,无需手动编码,支持事务传播、隔离级别配置。3)iBatis手动事务:通过SqlMapClient手动开启、提交、回滚事务,灵活性高,适合复杂业务事务场景。五、实战坑点与优化13、iBatis常见的开发踩坑点有哪些?1)动态SQL拼接多余and/or,导致SQL语法报错:iBatis无自动修剪功能,需要手动控制条件前缀,是最常见问题。2)混淆#和$,导致SQL注入或者查询参数失效。3)数据库字段名和实体属性名不一致,未配置resultMap,导致查询结果为null。4)批量操作未使用iterate标签,循环单条操作,性能极低。5)二级缓存滥用,频繁修改的数据开启缓存,导致脏数据问题。6)未关闭会话、未释放连接,导致数据库连接池耗尽。14、iBatis批量操作怎么实现?核心依靠iterate动态标签实现批量插入、批量更新、批量删除。将集合参数传入,通过iterate遍历集合,批量拼接SQL语句,一次性提交数据库,替代for循环单条执行,大幅提升批量操作性能。同时可结合SqlMapClient的batch模式,开启批量处理模式,减少数据库交互次数。15、iBatis分页怎么实现?iBatis本身无内置分页插件,企业实战两种实现方式:1)原生SQL分页:手动在MapperSQL中编写limit、rownum分页语句,适配不同数据库,简单直接、性能稳定,老旧项目主流用法。2)自定义分页工具类:封装分页参数,自动拼接分页SQL,统计总条数,封装分页结果,减少重复代码。区别于MyBatis,iBatis无PageHelper这类通用插件,基本都是手动实现分页。16、iBatis如何解决字段名和实体类属性名不一致问题?三种常用解决方案:1)查询SQL中使用字段别名,让别名和实体属性名一致,配合resultClass使用,简单快捷;2)自定义resultMap映射,手动绑定数据库字段和实体属性,最稳定、通用;3)全局配置驼峰命名转换,统一开启下划线转驼峰规则,全局生效,无需逐个配置。六、进阶面试题17、iBatis为什么比原生JDBC效率高、开发快?1)封装了JDBC冗余代码:无需手动获取连接、创建Statement、遍历结果集、关闭资源,大幅减少代码量;2)自动完成结果集映射,无需手动set属性,避免重复模板代码;3)内置连接池管理,优化数据库连接复用,减少连接创建销毁开销;4)支持动态SQL、批量操作,适配复杂业务,原生JDBC实现成本极高;5)SQL与代码解耦,SQL统一管理在xml文件中,便于维护、调优、迭代。18、iBatis适配复杂多表查询怎么做?1)多表关联SQL手动编写,支持leftjoin、innerjoin所有原生SQL语法;2)通过resultMap配置嵌套映射,实现一对一、一对多关联数据封装;3)通过关联查询一次性查询所有数据,避免N+1查询问题;4)复杂统计、分组查询直接手写SQL,框架不限制语法,灵活性远超全自动ORM框架。19、iBatis中N+1查询问题是什么?如何解决?问题场景:查询主表数据后,循环每条主数据查询关联从表数据,产生1次主查询+N次从表查询,数据库交互次数过多,性能极差。解决方案:1)使用多表关联联查,一次性查询所有数据;2)通过resultMap

温馨提示

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

评论

0/150

提交评论