当前位置: 首页 > article >正文

MyBatis常见面试题总结

一、MyBatis基础概念

  1. 什么是MyBatis?
    • MyBatis是一个支持普通SQL查询、存储过程和高级映射的持久层框架。MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis使用简单的XML或注解用于配置和原始映射,将接口和Java的POJOs(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。
  2. MyBatis的应用场景有哪些?
    • MyBatis特别适合那些想要灵活控制数据库查询,又不想写太多重复代码的人。它常用于需要灵活编写复杂SQL、避免ORM生成低效查询、对已有数据库结构进行操作、需要手动优化SQL查询性能以及需要精确控制SQL语句和数据库操作的应用。
  3. MyBatis有哪些优点?
    • 灵活性强:允许开发人员编写自定义SQL语句,能够根据项目需求进行灵活配置和扩展。
    • 可读性好:使用简洁的XML或注解配置方式,可以清晰地表达SQL语句和数据映射关系。
    • 性能高:提供了高效的缓存机制,能够有效地减少数据库操作的次数,并支持批量操作和分页查询等功能。
    • 易于集成:可以与多种数据库和Web框架无缝集成,能够适应不同的应用场景。
  4. MyBatis有哪些缺点?
    • 学习成本较高:相比于其他ORM框架,MyBatis需要开发人员熟悉SQL语句的编写和调优。
    • 配置较为繁琐:MyBatis的配置文件较多,需要开发人员仔细配置,否则容易出现错误。
    • SQL语句调试困难:MyBatis将SQL语句和Java代码分离,当SQL语句出现问题时,调试起来相对困难。
    • 不适合小型项目:对于小型项目而言,MyBatis的优势可能不够明显,反而会增加项目的开发成本和复杂度。

二、MyBatis核心组件与工作原理

  1. MyBatis有哪些核心组件?
    • SqlSessionFactory:创建和管理SqlSession对象的工厂。
    • SqlSession:执行SQL语句的接口,管理数据库会话。
    • Executor:负责执行SQL语句,管理缓存和事务。
    • Mapper接口:映射SQL语句与Java对象的方法接口。
    • Configuration:全局配置类,包含MyBatis的所有配置信息。
  2. MyBatis的工作原理是什么?
    • MyBatis的工作原理主要包括以下几个步骤:读取配置文件、创建SqlSessionFactory、获取SqlSession、调用Mapper接口执行SQL语句、处理结果并返回。
  3. 为什么Mapper接口不需要实现类?
    • MyBatis使用代理模式(动态代理)来为Mapper接口生成实现类,处理SQL语句的执行,避免手动编写实现代码。

三、MyBatis高级特性

  1. MyBatis如何进行分页?分页插件的原理是什么?
    • MyBatis可以使用RowBounds对象进行分页,它是针对ResultSet结果集执行的内存分页,而非物理分页。也可以在SQL内直接书写带有物理分页的参数来完成物理分页功能,或者使用分页插件来完成物理分页。分页插件的基本原理是使用MyBatis提供的插件接口,实现自定义插件,在插件的拦截方法内拦截待执行的SQL,然后重写SQL,根据dialect方言,添加对应的分页语句。
  2. MyBatis的一级、二级缓存是什么?
    • 一级缓存:基于PerpetualCache的HashMap本地缓存,其存储作用域为Session,当Session flush或close之后,该Session中的所有Cache就将清空,默认打开一级缓存。
    • 二级缓存:与一级缓存其机制相同,默认也是采用PerpetualCache,HashMap存储,不同在于其存储作用域为Mapper(Namespace),并且可自定义存储源,如Ehcache。默认不打开二级缓存,要开启二级缓存,使用二级缓存属性类需要实现Serializable序列化接口。
  3. MyBatis如何将SQL执行结果封装为目标对象并返回?
    • MyBatis可以通过标签逐一定义数据库列名和对象属性名之间的映射关系,或者使用SQL列的别名功能将列的别名书写为对象属性名。有了列名与属性名的映射关系后,MyBatis通过反射创建对象,同时使用反射给对象的属性逐一赋值并返回。
  4. MyBatis支持动态SQL吗?有哪些动态SQL?
    • MyBatis支持动态SQL,可以在XML映射文件内以标签的形式编写动态SQL。MyBatis提供了9种动态SQL标签:trim、where、set、foreach、if、choose、when、otherwise、bind。这些标签可以根据表达式的值完成逻辑判断并动态拼接SQL的功能。
  5. MyBatis能执行一对一、一对多的关联查询吗?
    • MyBatis能执行一对一、一对多的关联查询。可以通过resultMap标签来定义Java对象和数据库表之间的映射关系,包括一对一和一对多的关联关系。
  6. MyBatis是否支持延迟加载?
    • MyBatis支持延迟加载。延迟加载是一种在需要时才加载数据的技术,可以提高应用程序的性能。在MyBatis中,可以通过配置来实现延迟加载。

四、MyBatis常见问题与解决方案

  1. #{}和${}的区别是什么?
    • #{}使用预编译的方式来处理SQL语句中的参数,将传入的参数值以安全的方式替换掉占位符。这种方式可以有效地防止SQL注入等安全问题。
    • 则是直接将参数值替换到SQL语句中。这种方式的好处是可以直接拼接字符串,但也带来了一些安全问题,如SQL注入。因此,在使用{}时需要开发人员自行保证参数的合法性。
  2. 在mapper中如何传递多个参数?
    • 在MyBatis的mapper中传递多个参数时,可以使用@Param注解来标注参数名称,以便在XML映射文件中引用。另外,也可以使用对象来封装多个参数,然后在XML映射文件中通过对象的属性来引用参数。
  3. 实体类属性名和表中字段名不一样怎么办?
    • 当实体类属性名和表中字段名不一样时,可以在MyBatis的XML映射文件中使用resultMap标签来定义Java对象和数据库表之间的映射关系。通过指定列名和属性名之间的对应关系,可以实现字段名和属性名之间的映射。
  4. MyBatis的XML映射文件中,不同的XML映射文件id是否可以重复?
    • 在MyBatis的XML映射文件中,如果配置了namespace,那么不同的XML映射文件中的id可以重复。因为namespace+id是作为Map的key使用的,如果没有namespace,就剩下id,那么id重复会导致数据互相覆盖。有了namespace,自然id就可以重复,因为namespace不同,namespace+id自然也就不同。

http://www.kler.cn/a/373822.html

相关文章:

  • 一年期免费HTTPS证书:网络安全新选择
  • nodejs包管理器pnpm
  • 隐私保护下的数据提取策略
  • Chromium127编译指南 Linux篇 - 额外环境配置(五)
  • SQLite从入门到精通面试题及参考答案
  • zabbix 6.0 监控clickhouse(单机)
  • wps Excel下拉框生成填充及下拉框内容颜色格式修改
  • 云安全联盟倡导对关键基础设施实施零信任
  • ffmpeg视频滤镜:网格-drawgrid
  • MAC | 应用全屏快捷键 |浏览器隐藏导航栏
  • 【测试平台】【前端VUE】工具页面学习记录
  • SSH登录介绍
  • 1024·工作流智能体挑战赛结果出炉
  • JavaScript闭包(Closure)详解与应用实例
  • 财经领域波澜现,茅台价格动心弦。供需关系新篇章,高端白酒市场寒。经济转型消费变,电商大促供需悬。经济压力需求减,理性消费新风传。
  • 智能视频多语言AI配音/翻译工具
  • Java项目实战II基于微信小程序的马拉松报名系统(开发文档+数据库+源码)
  • 【ArcGISPro】宣布推出适用于 ArcGIS 的 AI 助手
  • 51c深度学习~合集6
  • 【系统设计】探索数据库的世界:轻松掌握基本原理
  • 初识字节码文件--Java
  • 【C#】搭建环境之CSharp+OpenCV
  • 树莓派基础设置--1.更新和升级操作系统
  • 文件中台与安全:集成方案的探索与实践
  • REST APIs与微服务:关键差异
  • dicom基础:乳腺影像方位信息介绍