【面试题】MyBatis面试题

目录

  • 简述MyBatis是什么,它解决了什么问题?
  • MyBatis中Mapper.xml文件的作用是什么?
  • #{}和${}在动态SQL中的区别是什么?
  • 如何在MyBatis中处理一对一和一对多的关联映射?
  • MyBatis的工作原理是什么?
  • 如何进行MyBatis的性能优化?
  • MyBatis是如何与Spring框架集成的?为什么要集成?
  • MyBatis有哪些插件机制?能否举个自定义插件的例子?
  • 说一下 MyBatis 的一级缓存和二级缓存?
  • resultType与resultMap有什么区别?
  • Mybatis一级缓存和二级缓存失效的情况有哪些?
  • MyBatis缓存的查询顺序?
  • 如何解决二级缓存中的数据一致性问题?

简述MyBatis是什么,它解决了什么问题?

  • MyBatis是一个半自动化的ORM(对象关系映射)框架,它允许开发者直接编写SQL语句,提供了一种将SQL查询结果映射到Java对象的方法。
  • 它主要解决JDBC编程的繁琐性,如手动设置参数、获取结果集等,同时提供了更灵活的SQL控制能力。

MyBatis中Mapper.xml文件的作用是什么?

  • Mapper.xml文件用于定义SQL语句和结果映射。
  • 每个XML文件通常对应一个Mapper接口,包含select、insert、update、delete等标签,定义了具体的SQL查询和更新语句,以及如何将查询结果映射到Java对象上。

#{}和${}在动态SQL中的区别是什么?

  • #{}用于参数化SQL,MyBatis会自动进行预编译处理,可以防止SQL注入攻击;
  • ${}则是字符串替换,直接拼接到SQL中,不推荐用于含有用户输入的参数,以免SQL注入风险。

如何在MyBatis中处理一对一和一对多的关联映射?

  • 一对一关联可以通过嵌套查询、嵌套结果等方式实现;
  • 一对多关联常用的方式是集合(collection)映射,可以在查询结果映射时通过<collection>标签定义关联的集合属性。

MyBatis的工作原理是什么?

  • MyBatis通过读取配置文件,使用SqlSessionFactoryBuilder创建SqlSessionFactory,然后SqlSessionFactory打开SqlSession,执行SQL并处理结果映射,最后关闭SqlSession。

如何进行MyBatis的性能优化?

  • 使用连接池减少数据库连接创建销毁开销;
  • 合理配置缓存策略;
  • 避免在映射文件中使用过多的嵌套查询和子查询,考虑使用联合查询;
  • 利用批量操作减少数据库交互次数;根据实际需要开启或关闭二级缓存。

MyBatis是如何与Spring框架集成的?为什么要集成?

  • 通过Spring的XML配置或注解方式配置数据源和SqlSessionFactoryBean,实现MyBatis与Spring的无缝集成。
  • 集成后可以利用Spring的依赖注入、事务管理等功能,使得应用架构更加清晰,易于管理和维护。

MyBatis有哪些插件机制?能否举个自定义插件的例子?

  • MyBatis提供拦截器(Interceptor)机制作为插件体系,可以拦截Executor、ParameterHandler、ResultSetHandler等组件的执行过程。
  • 一个简单例子可以是日志插件,用于记录SQL执行的详细信息。

说一下 MyBatis 的一级缓存和二级缓存?

一级缓存:

  • 基于 PerpetualCache 的 HashMap 本地缓存,它的生命期是和 SQLSession 一致的,有多个 SQLSession 或者分布式的环境中数据库操作,可能会出现脏数据。
  • 当 Session flush 或 close 之后,该 Session 中的所有 Cache 就将清空;
  • 一级缓存是SqlSession级别的,通过同一个SqlSession查询的数据会被缓存,下次查询相同的数据,就会从缓存中直接获取,不会从数据库重新访问,一级缓存是默认开启的。

二级缓存:

  • 也是基于 PerpetualCache 的 HashMap 本地缓存,不同在于其存储作用域为 Mapper 级别的,如果多个SQLSession之间需要共享缓存,则需要使用到二级缓存,并且二级缓存可自定义存储源,如 Ehcache。
  • 默认不打开二级缓存,要开启二级缓存,使用二级缓存属性类需要实现 Serializable 序列化接口(可用来保存对象的状态)。
  • 二级缓存是SqlSessionFactory级别,通过同一个SqlSessionFactory创建的SqlSession查询的结果会被缓存,此后若再次执行相同的查询语句,结果就会从缓存中获取。

开启二级缓存数据查询流程:二级缓存 -> 一级缓存 -> 数据库。

缓存更新机制:

  • 当某一个作用域(一级缓存 Session/二级缓存 Mapper)进行了C/U/D 操作后,默认该作用域下所有 select 中的缓存将被 clear。

resultType与resultMap有什么区别?

resultmap与resulttype的区别为:对象不同、描述不同、类型适用不同
对象不同

  1. resultmap:resultMap如果查询出来的列名和pojo的属性名不一致,通过定义一个resultMap对列名和pojo属性名之间作一个映射关系。
  2. resultType:resultType使用resultType进行输出映射,只有查询出来的列名和pojo中的属性名一致,该列才可以映射成功。

描述不同

  1. resultmap:resultMap对于一对一表连接的处理方式通常为在主表的pojo中添加嵌套另一个表的pojo,然后在mapper.xml中采用association节点元素进行对另一个表的连接处理。
  2. resulTtype:resultType无法查询结果映射到pojo对象的pojo属性中,根据对结构集查询遍历的需要选择使用resultType还是resultMap。适用于单表查询。

类型适用不同

  1. resultmap:mybatis中在查询进行select映射的时候,返回类型可以用resultType,也可以用resultMap。
  2. resulttype:resultType是直接表示返回类型的,而resultMap则是对外部ResultMap的引用,但是resultType跟resultMap不能同时存在。

Mybatis一级缓存和二级缓存失效的情况有哪些?

一级缓存是SqlSession级别的,通过同一个SqlSession查询的数据会被缓存,下次查询相同的数据,就会从缓存中直接获取,不会从数据库重新访问,一级缓存是默认开启的,一级缓存失效的情况:

  • 使用另一个SqlSession
  • 同一个SqlSession但是查询条件不同
  • 同一个SqlSession但是两次查询中间执行了任何一次增删改操作
  • 同一个SqlSession但是两次查询中间手动清空了缓存,手动清空缓存的方法是调用SqlSession的 clearCache() 方法

二级缓存是SqlSessionFactory级别,通过同一个SqlSessionFactory创建的SqlSession查询的结果会被缓存,此后若再次执行相同的查询语句,结果就会从缓存中获取,二级缓存失效的情况:

  • 两次查询之间执行了任意的增删改,会使一级和二级缓存同时失效。

MyBatis缓存的查询顺序?

  1. 先查询二级缓存,因为二级缓存中可能会有其他程序已经查出来的数据,可以拿来直接使用
  2. 如果二级缓存没有命中,再查询一级缓存
  3. 如果一级缓存也没有命中,则查询数据库

如何解决二级缓存中的数据一致性问题?

  • 使用缓存同步策略,比如读写分离后通过消息队列更新缓存;
  • 利用缓存穿透、缓存击穿和缓存雪崩的解决方案;
  • 对于高一致性要求的场景,也可以考虑牺牲一些性能,采用更为直接的数据库查询代替缓存。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/34151.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

图论:图的表示方法

图 2. 图的表示 2.1 邻接矩阵 邻接矩阵 是一种编程语言中用二维数组表示图的方法&#xff0c;更适用于节点数量够的多的 稠密图(边数接近顶点数的平方) class Node{int id;//节点的id&#xff0c;用于寻址Object obj;//存储的内容vector<Edge>edges;//表示与节点的出…

【仿真】UR机器人相机标定、立体标定、手眼标定、视觉追踪(双目)

实现在CoppeliaSim环境中进行手眼标定和目标追踪的一个例子。它主要涉及到机器人、机器视觉和控制算法的编程&#xff0c;使用了Python语言。接下来对该代码的主要类和方法进行解析&#xff1a; 1. 导入相关库 用于与CoppeliaSim模拟器通过ZeroMQ接口通信。包含Rotation类&…

想一次卸载一堆应用程序吗?这里有你想认识的一个应用程序

序言 Windows不允许你批量卸载应用程序。但默认的Windows卸载管理器并不是从电脑中删除应用程序的唯一方法。如果你经常希望一次卸载多个项目,这样你就不必等待按顺序执行,我们为你提供了该工具。 默认Windows卸载程序无法执行的所有操作 在Windows上卸载应用程序可能会一…

SF-YOLOv5——基于改进的特征融合模式的轻量级小目标检测算法

概述 提出了一种改进的YOLOv5模型&#xff0c;名为Small-Fast-YOLOv5 (SF-YOLOv5)&#xff0c;专门用于小目标检测。通过合理裁剪大目标检测层的特征图输出&#xff0c;显著减少了模型所需的计算资源&#xff0c;使模型变得更加轻量级。 还提出了一种改进的特征融合方法&#…

CV每日论文--2024.6.24

1、Whiteboard-of-Thought: Thinking Step-by-Step Across Modalities 中文标题&#xff1a;思维白板&#xff1a;跨模式逐步思考 简介&#xff1a;这段话描述了一种利用思维白板提示来增强大型语言模型在视觉推理任务中的性能的方法。 人类在解决需要视觉思考的问题时,通常会…

英语口语练习评测的开发实现

英语口语评测是一个复杂的系统&#xff0c;需要综合考虑语音识别、语音评测、自然语言处理等多种技术。以下是一些常见的英语口语评测开发框架。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 基于语音识别的口语评测框架这种框架主要…

第28课 绘制原理图——绘制导线

概述 放置完元器件之后&#xff0c;接着就要用导线将元器件的管脚一个一个连起来了。 绘制导线的方法 点击快速工具条上的“线”命令&#xff0c;进入绘制导线的过程。 点击选择某个管脚或电源端口&#xff0c;作为导线的起始端。 再点击选择另一个管脚或电源端口&#xff0c…

React@16.x(40)路由v5.x(5)常见应用场景(2)- 实现类似 vue 的路由模式

目录 1&#xff0c;vue-router2&#xff0c;React 模拟实现 1&#xff0c;vue-router vue 的路由配置文件&#xff0c; // src/router/index.ts const routes [{path: "/news",children: [{ path: "", component: NewsView },{ path: "detail"…

瞄准Windows的新兴僵尸网络:Kraken

2021 年 10 月&#xff0c;ZeroFox Intelligence 披露了名为 Kraken 的僵尸网络。Kraken 通过 SmokeLoader 进行传播&#xff0c;每次更新攻击基础设施时都会扩大规模。尽管与 2008 年发现的 Kraken 僵尸网络同名&#xff0c;但二者并没有其他共同点。 功能 自从 2021 年 10 …

养殖自动化通风系统:未来畜牧业的智能守护者

在现代畜牧业中&#xff0c;养殖环境的控制对于动物的健康成长和养殖业者的成功至关重要。养殖自动化通风系统凭借其先进技术和精密设备&#xff0c;实现了对养殖场内环境条件的精准调控&#xff0c;显著提升了养殖效率和动物福利。本文将深入探讨养殖自动化通风系统的必要性、…

Unity3D 有限状态机(FSM)的架构与实现详解

一、引言 在游戏开发中&#xff0c;特别是使用Unity3D这样的游戏引擎时&#xff0c;控制游戏对象的行为往往是一个复杂且关键的任务。有限状态机&#xff08;Finite State Machine&#xff0c;FSM&#xff09;作为一种强大的工具&#xff0c;被广泛用于管理游戏对象的状态转换…

CompletableFuture 场景DEMO代码展示

自定义线程池 自定义线程池好处参考&#xff1a; 线程是稀缺资源&#xff0c;如果被无限制的创建&#xff0c;不 仅会消耗系统资源&#xff0c;还会降低系统的稳定性&#xff0c;因此Java中提供线程池对线程进行统一分配、 调优和监控的框架。 自定义线程池ThreadPoolExecutor_…

Talking Web

1. curl 1.1 http curl http://127.0.0.1:80 向目标主机端口发送http请求 1.2 httphead curl -H “Host: 18ed3df584cd48328b5839443aa7b42b” http://127.0.0.1:80 1.3 httppath curl http://127.0.0.1:80/853c64cd218f80d0a59665666fb2ab80 1.4 URL编码路径 &#xff0…

LeetCode 2732. 找到矩阵中的好子集

一、题目描述 给定一个 m x n 的整数矩阵 mat 和一个整数 k&#xff0c;我们需要找到一个大小为 k 的子集 rows&#xff0c;使得这个子集对应的行在矩阵 mat 中构成的子矩阵中&#xff0c;所有元素之和最大。返回这个子矩阵中所有元素之和的最大值。 注意&#xff1a; 子集 …

天天大爆推文玩法营销号软件下载地址

天天大爆推文玩法营销号软件下载地址 天天大爆推文玩法营销号是一种营销策略&#xff0c;通过在社交媒体上发布频繁的推文来吸引关注和增加品牌曝光度。以下是一些可以用于天天大爆推文玩法营销号的策略&#xff1a; 营销号工具使用教程&#xff1a;https://iimenvrieak.feis…

数据结构之前缀树

写在前面 源码 。 前缀树&#xff0c;又叫做trie树&#xff0c;字典树&#xff0c;是一种多叉的树&#xff0c;一般用于单词前缀匹配的相关场景中&#xff0c;比如&#xff1a; 本文看下使用Java如何来实现这种数据结构。 1&#xff1a;基本介绍 思想&#xff1a;空间换时…

典型传感器简介及驱动安装

双目视觉传感器 Indemind 传感器简介 INDEMIND M1 是专为开发者提供的一款硬件&#xff0c;采用“双目摄像头IMU”多传感器融合架构与 微秒级时间同步机制&#xff0c;为视觉 SLAM 研究提供精准稳定数据源&#xff0c;以满足 SLAM 研究、导航及 避障开发、视觉动作捕捉开发、…

C++基础编程100题-014 OpenJudge-1.3-12 计算球的体积

更多资源请关注纽扣编程微信公众号 http://noi.openjudge.cn/ch0103/12/ 描述 对于半径为r的球&#xff0c;其体积的计算公式为$ V4/3*πr^3 $&#xff0c;这里取π 3.14。 现给定r&#xff0c;求V。 输入 输入为一个不超过100的非负实数&#xff0c;即球半径&#xff0…

C# 高频面试题

C# 初级面试题及详细解答 1. C#中的值类型和引用类型的区别是什么&#xff1f; 解答: 值类型存储在堆栈上&#xff0c;直接包含数据&#xff1b;引用类型存储在堆上&#xff0c;存储的是对象的引用。值类型包括基本类型如 int、float 和 struct&#xff1b;引用类型包括 clas…

Perl编程探索:深入理解数组变量

Perl语言以其在文本处理和系统管理任务中的强大能力而受到广泛欢迎。在Perl中&#xff0c;数组是处理多个值集合的一种关键数据结构。本文将深入探讨Perl中的数组变量&#xff0c;包括它们的声明、初始化、访问和操作。 Perl数组的基本概念 在Perl中&#xff0c;数组可以用来…