MyBatis面试题总结,详细(2024最新)

面试必须要看看

1、MyBatis 中的一级缓存和二级缓存是什么?它们的区别是什么?
MyBatis 中的一级缓存是指 SqlSession 对象内部的缓存,它是默认开启的。一级缓存的生命周期是与 SqlSession 对象绑定的,当 SqlSession 关闭时,缓存也会自动清空。一级缓存的作用是减少对数据库的查询次数,提高查询效率。
MyBatis 中的二级缓存是指 SqlSessionFactory 对象内部的缓存,它需要手动开启和配置。二级缓存的生命周期是与 SqlSessionFactory 对象绑定的,当应用程序关闭时,缓存也会自动清空。二级缓存的作用是在多个 SqlSession 之间共享缓存,提高查询效率。二级缓存可以使用 Ehcache、Redis 等第三方缓存框架来实现。

2、MyBatis 中的事务是如何控制的?
MyBatis 中的事务是由 JDBC 控制的。在 Mapper 接口方法中,可以使用 @Transactional 注解来声明事务的范围。MyBatis 支持声明式事务和编程式事务两种方式,可以根据实际需求选择适合的方式来控制事务。

3、MyBatis 中的多数据源是如何实现的?
MyBatis 中的多数据源可以通过配置多个 SqlSessionFactory 对象来实现。在 Mapper 接口中,可以使用 @MapperScan 注解来指定要扫描的 Mapper 接口所在的包,从而将多个数据源与不同的 Mapper 接口关联起来。

4、MyBatis 中的缓存失效是如何处理的?
MyBatis 中的缓存失效可以通过以下几种方式来处理:

手动清除缓存:在 Mapper 接口中,可以使用 @CacheEvict 注解来手动清除缓存。

设置缓存过期时间:可以在映射文件或 Mapper 接口中,设置缓存的过期时间,从而实现缓存的自动失效。

在 SQL 语句中添加 FOR UPDATE 子句:可以在 SQL 语句中添加 FOR UPDATE 子句,从而实现缓存的失效和锁定。

5、MyBatis 中的动态 SQL 是什么?它的作用是什么?
MyBatis 中的动态 SQL 是指根据条件动态生成 SQL 语句的技术。它的作用是可以根据实际条件生成相应的 SQL 语句,从而实现更加灵活的查询操作。MyBatis 中可以使用动态 SQL 来实现 if、choose、when、otherwise、foreach 等语句块。

6、MyBatis 中的 SQL 解析是如何实现的?
MyBatis 中的 SQL 解析是通过 OGNL(Object-Graph Navigation Language)表达式实现的。在映射文件或 Mapper 接口中,可以使用 OGNL 表达式来动态生成 SQL 语句和参数。OGNL 表达式可以访问 Java 对象和集合,以实现复杂的查询操作。

7、MyBatis 中的 TypeHandler 是什么?它的作用是什么
MyBatis 中的 TypeHandler 是用于实现 Java 类型与 JDBC 类型之间的转换的组件。它的作用是可以自定义数据类型的转换规则,从而实现更加灵活的数据映射。MyBatis 中内置了许多常见的 TypeHandler,同时也可以自定义 TypeHandler。

8、MyBatis 中的注解和 XML 配置文件有什么区别?它们的优缺点是什么?
MyBatis 中的注解和 XML 配置文件都可以用来配置 Mapper 接口和 SQL 语句。它们的区别在于,注解方式是通过 Java 代码来实现配置,而 XML 配置文件是通过 XML 文件来实现配置。注解方式相对于 XML 配置文件来说,更加简洁和方便,但是可读性和可维护性可能会差一些。XML 配置文件相对于注解方式来说,可读性和可维护性更好,但是相对繁琐一些。另外,注解方式不支持动态 SQL,而 XML 配置文件支持动态 SQL。

9、MyBatis 中的 Mapper 接口和 Mapper 映射文件是如何关联的?
在 MyBatis 中,Mapper 接口和 Mapper 映射文件是通过一个相同的命名空间来关联的。在 Mapper 接口中定义的方法名必须与 Mapper 映射文件中定义的语句的 id 属性值相同。同时,Mapper 映射文件中的 namespace 属性值必须与 Mapper 接口的全限定名相同。

10、MyBatis 中的事务是如何控制的?
在 MyBatis 中,事务是通过 SqlSession 来控制的。在默认情况下,MyBatis 中的事务是开启的,且事务的隔离级别为 REPEATABLE READ。如果需要自定义事务的隔离级别,可以在 SqlSessionFactory 中配置事务管理器和数据源,从而实现自定义事务的控制。另外,MyBatis 还提供了 @Transactional 注解来实现事务的控制,通过在方法上添加 @Transactional 注解来指定事务的隔离级别和传播行为。

11、#{}和${}的区别是什么?
${}是字符串替换,#{}是预处理;

Mybatis在处理${}时,就是把这个符号直接替换成变量的值。而Mybatis在处理#{}时,会对sql语句进行预处理,将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值;

使用#{}可以有效的防止SQL注入,提高系统安全性。

12、Mybatis的Xml映射文件中,不同的Xml映射文件,id是否可以重复?
不同的Xml映射文件,如果配置了namespace,那么id可以重复;如果没有配置namespace,那么id不能重复;

原因就是namespace+id是作为Map的key使用的,如果没有namespace,就剩下id,那么,id重复会导致数据互相覆盖。有了namespace,自然id就可以重复,namespace不同,namespace+id自然也就不同。

13、Mybatis是如何进行分页的?分页插件的原理是什么?
Mybatis使用RowBounds对象进行分页,它是针对ResultSet结果集执行的内存分页,而非物理分页。可以在sql内直接书写带有物理分页的参数来完成物理分页功能,也可以使用分页插件来完成物理分页。
分页插件的基本原理是使用Mybatis提供的插件接口,实现自定义插件,在插件的拦截方法内拦截待执行的sql,然后重写sql

14、Mybatis的一级、二级缓存?
MyBatis的缓存分为一级缓存和二级缓存,一级缓存是SqlSession级别的缓存,二级缓存是Mapper级别的缓存。

(1)一级缓存: 基于 PerpetualCache 的 HashMap 本地缓存,其存储作用域为 Session,当 Session flush 或 close 之后,该 Session 中的所有 Cache 就将清空,默认打开一级缓存。

(2)二级缓存与一级缓存其机制相同,默认也是采用 PerpetualCache,HashMap 存储,不同在于其存储作用域为 Mapper(Namespace),并且可自定义存储源,如 Ehcache。默认不打开二级缓存,要开启二级缓存,使用二级缓存属性类需要实现Serializable序列化接口(可用来保存对象的状态),可在它的映射文件中配置 ;

(3)对于缓存数据更新机制,当某一个作用域(一级缓存 Session/二级缓存Namespaces)的进行了C/U/D 操作后,默认该作用域下所有 select 中的缓存将被 clear 掉并重新更新,如果开启了二级缓存,则只根据配置判断是否刷新。

15、Mybatis是如何将sql执行结果封装为目标对象并返回的?都有哪些映射形式?
第一种是使用标签,逐一定义数据库列名和对象属性名之间的映射关系。

第二种是使用sql列的别名功能,将列的别名书写为对象属性名。

有了列名与属性名的映射关系后,Mybatis通过反射创建对象,同时使用反射给对象的属性逐一赋值并返回,那些找不到映射关系的属性,是无法完成赋值的。

16、使用MyBatis的mapper接口调用时有哪些要求?
Mapper接口方法名和mapper.xml中定义的每个sql的id相同;
Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql 的parameterType的类型相同;
Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同;
Mapper.xml文件中的namespace即是mapper接口的类路径。

17、请说说MyBatis的工作原理
在这里插入图片描述

1、 读取MyBatis配置文件:mybatis-config.xml为MyBatis的全局配置文件,配置了MyBatis的运;行环境等信息,例如数据库连接信息。
2、 加载映射文件映射文件即SQL映射文件,该文件中配置了操作数据库的SQL语句,需要在;MyBatis 配置文件 mybatis-config.xml 中加载。mybatis-config.xml 文件可以加载多个映射文件,每个文件对应数据库中的一张表。
3、 构造会话工厂:通过MyBatis的环境等配置信息构建会话工厂SqlSessionFactory;
4、 创建会话对象:由会话工厂创建SqlSession对象,该对象中包含了执行SQL语句的所有方法;
5、 Executor执行器:MyBatis底层定义了一个Executor接口来操作数据库,它将根据SqlSession;传递的参数动态地生成需要执行的 SQL 语句,同时负责查询缓存的维护。
6、 MappedStatement对象:在Executor接口的执行方法中有一个MappedStatement类型的参;数,该参数是对映射信息的封装,用于存储要映射的 SQL 语句的 id、参数等信息。
7、 输入参数映射:输入参数类型可以是Map、List等集合类型,也可以是基本数据类型和POJO类;型。输入参数映射过程类似于 JDBC 对 preparedStatement 对象设置参数的过程。
8、 输出结果映射:输出结果类型可以是Map、List等集合类型,也可以是基本数据类型和POJO类;型。输出结果映射过程类似于 JDBC 对结果集的解析过程。

18、Mybatis都有哪些Executor执行器?它们之间的区别是什么?
Mybatis有三种基本的Executor执行器,SimpleExecutor、ReuseExecutor、BatchExecutor。
SimpleExecutor:每执行一次update或select,就开启一个Statement对象,用完立刻关闭Statement对象。
ReuseExecutor:执行update或select,以sql作为key查找Statement对象,存在就使用,不存在就创建,用完后,不关闭Statement对象,而是放置于Map<String, Statement>内,供下一次使用。简言之,就是重复使用Statement对象。
BatchExecutor:执行update(没有select,JDBC批处理不支持select),将所有sql都添加到批处理中(addBatch()),等待统一执行(executeBatch()),它缓存了多个Statement对象,每个Statement对象都是addBatch()完毕后,等待逐一执行executeBatch()批处理。与JDBC批处理相同。

19、Mybatis是否支持延迟加载?如果支持,它的实现原理是什么?
Mybatis仅支持association关联对象和collection关联集合对象的延迟加载,association指的就是一对一,collection指的就是一对多查询。在Mybatis配置文件中,可以配置是否启用延迟加载lazyLoadingEnabled=true|false。
它的原理是,使用CGLIB创建目标对象的代理对象,当调用目标方法时,进入拦截器方法,比如调用a.getB().getName(),拦截器invoke()方法发现a.getB()是null值,那么就会单独发送事先保存好的查询关联B对象的sql,把B查询上来,然后调用a.setB(b),于是a的对象b属性就有值了,接着完成a.getB().getName()方法的调用。这就是延迟加载的基本原理。

20、如何获取生成的主键
新增标签中添加:keyProperty=" ID " 即可

<insert id="insert" useGeneratedKeys="true" keyProperty="userId" >
    insert into user(user_name, user_password, create_time)
    values(#{userName},{userPassword} ,{createTime, jdbcType=TIMESTAMP})
</insert>
int id=mapper.insert(user)

21、简述Mybatis的插件运行原理,以及如何编写一个插件。
Mybatis仅可以编写针对ParameterHandler、ResultSetHandler、StatementHandler、Executor这4种接口的插件,Mybatis使用JDK的动态代理,为需要拦截的接口生成代理对象以实现接口方法拦截功能,每当执行这4种接口对象的方法时,就会进入拦截方法,具体就是InvocationHandler的invoke()方法,当然,只会拦截那些你指定需要拦截的方法。
实现Mybatis的Interceptor接口并复写intercept()方法,然后在给插件编写注解,指定要拦截哪一个接口的哪些方法即可,记住,别忘了在配置文件中配置你编写的插件。

22、MyBatis的乐观锁是怎么实现的?
MyBatis的乐观锁是通过版本号实现的,即在数据表中增加一个版本号字段。在更新时,比较版本号是否一致,如果一致才更新数据。

@Update("UPDATE user SET name = #{name}, version = #{version + 1} WHERE id = #{id} AND version = #{version}")
int updateUser(User user);

23、 MyBatis中如何处理存储过程?
可以使用select标签调用存储过程,使用resultMap映射输出参数。

<select id="callProcedure" statementType="CALLABLE" parameterType="Map">
    {call my_procedure(
        #{inputParam, mode=IN, jdbcType=INTEGER},
        #{outputParam, mode=OUT, jdbcType=VARCHAR}
    )}
</select>

24、MyBatis的懒加载是什么?
懒加载是指在需要使用关联数据时才去加载,而不是在查询主体数据时就将关联数据一并加载。

<resultMap id="userResultMap" type="User">
    <id property="id" column="id"/>
    <result property="name" column="name"/>
    <result property="age" column="age"/>
    <collection property="orders" ofType="Order" column="user_id" select="getOrdersByUserId" lazyLoading="true"/>
</resultMap>

25、MyBatis中如何处理返回多个结果集?
通过resultSets属性指定多个结果集。

<select id="getUserAndOrder" resultType="User" statementType="CALLABLE" parameterType="Map" resultSets="user,order">
    {call get_user_and_order(#{userId, mode=IN, jdbcType=INTEGER})}
</select>

26、MyBatis中如何实现动态更新?
使用标签可以方便地动态拼接更新字段。

UPDATE user name = #{name}, age = #{age}, WHERE id = #{id}

27、MyBatis 是如何处理枚举类型的?
MyBatis 可以通过实现 TypeHandler 接口来处理枚举类型。用户可以创建自定义的 TypeHandler,然后在 MyBatis 配置文件中指定这个自定义的类型处理器来对枚举类进行转换操作。

28、MyBatis 如何实现一对一关联查询?
可以通过联表查询或者嵌套查询来实现一对一映射。在 ResultMap 中使用 association 元素进行配置,确定对象之间的关联关系。

29、MyBatis 如何实现一对多关联查询?
通过在 ResultMap 中配置 collection 元素来实现一对多的映射。这可以根据一方的主键关联到多方的外键来实现。

可以关注,微信订阅号“猿来编码”的文章查看更多面试题或者其他工具分享

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vue3 ——笔记 (条件渲染,列表渲染,事件处理)

条件渲染 v-if v-if 指令用于条件性地渲染一块内容&#xff0c;只有v-if的表达式返回值为真才会渲染 v-else v-else 为 v-if 添加一个 else 区块 v-else 必须在v-if或v-else-if后 v-else-if v-else-if 是v-if 的区块 可以连续多次重复使用 v-show 按条件显示元素 v-sh…

8 Dubbo 应用案例(动手实操一波)

概述 案例相关配置可参考 GitHub:https://github.com/apache/dubbo-spring-boot-project/tree/master/dubbo-spring-boot-samples 创建服务接口项目 创建一个名为 hello-dubbo-service-user-api 的项目,该项目只负责定义接口 POM <?xml version="1.0" enco…

28.Gateway-网关过滤器

GatewayFilter是网关中提供的一种过滤器&#xff0c;可以多进入网关的请求和微服务返回的响应做处理。 GatewayFilter(当前路由过滤器&#xff0c;DefaultFilter) spring中提供了31种不同的路由过滤器工厂。 filters针对部分路由的过滤器。 default-filters针对所有路由的默认…

OpenCV如何实现背投

返回:OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇&#xff1a;OpenCV直方图比较 下一篇 :OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 目标 在本教程中&#xff0c;您将学习&#xff1a; 什么是背投以及它为什么有用如何使用 Ope…

GraspNet-1Billion 论文阅读

文章目录 GraspNet-1Billion总体数据集评价指标网络pointnet&#xff1a;Approach Network:Operation Network&#xff1a;Tolerance Network 摘要相关工作基于深度学习的抓取预测算法抓取数据集点云深度学习 GraspNet-1Billion CVPR2020 上海交大 论文和数据集地址&#xff1…

【漏洞复现】艺创科技智能营销路由器后台命令执行漏洞

漏洞描述&#xff1a; 成都艺创科技有限公司是一家专注于新型网络设备研发、生产、销售和服务的企业&#xff0c;在大数据和云时代&#xff0c;致力于为企业提供能够提升业绩的新型网络设备。 智能营销路由器存在后台命令执行漏洞&#xff0c;攻击者可利用漏洞获取路由器控制…

Android 开发工具使用

c调试 在NDK调试的时候&#xff0c;如果找不到 符号的话&#xff0c;我们可以在调试配置中添加符号地址的全路径一直到根目录&#xff1a;&#xff0c;xxx/armeabi-v7a&#xff1a; You must point the symbol search paths at the obj/local/ directory. This is also not a …

1146. 快照数组

java版本 class SnapshotArray {int id 0;List<int[]>[] snapshots;public SnapshotArray(int length) {snapshots new List[length];for (int i 0; i < length; i) {snapshots[i] new ArrayList<int[]>();}}public void set(int index, int val) {snapsho…

运算符重载(1)

1.加号运算符重载&#xff0c;这里用编译器统一的名称operator代替函数名 #include<iostream> using namespace std; //1.成员函数的加号重载 //2.全局函数的加号重载 class Person { public:Person() {};//1.成员函数的加号重载//Person operator(Person& p)//{// P…

E4980A是德科技E4980A精密LCR表

181/2461/8938产品概述&#xff1a; Keysight E4980A 精密 LCR 表为各种元件测量提供了精度、速度和多功能性的最佳组合。E4980A 在低阻抗和高阻抗范围内提供快速测量速度和出色的性能&#xff0c;是元件和材料的一般研发和制造测试的终极工具。LAN、USB 和 GPIB PC 连接可提高…

Springboot实现国际化以及部署Linux不生效问题

1、在application.properties 添加以下配置&#xff1a; #国际化配置 spring.messages.basenamei18n/messages/messages spring.messages.fallback-to-system-localefalse 2、添加配置文件在 resources目录下 如下图所示&#xff1a; 这个国际化文件命名有个坑&#xff0c;必须…

校车车载4G视频智能监控系统方案

一、项目背景 随着社会的快速发展&#xff0c;校车安全问题日益受到人们的关注。为了提高校车运营的安全性&#xff0c;保障学生的生命安全&#xff0c;我们提出了一套校车车载4G视频智能监控系统方案。该系统能够实时监控校车内部和外部环境&#xff0c;及时发现并处理潜在的…

多线程模型浅谈

优质博文&#xff1a;IT-BLOG-CN 笔者近期在维护的项目中发现了一些比较随机的问题&#xff0c;时有时无的&#xff0c;排查之后发现是使用多线程导致的&#xff0c;恍然之下研究了下多线程的底层模型相关知识&#xff0c;现不大家简要分享下。 一个程序进程可包含多个线程&am…

统计建模——模型——python为例

统计建模涵盖了众多数学模型和分析方法&#xff0c;这些模型和方法被广泛应用于数据分析、预测、推断、分类、聚类等任务中。下面列举了一些常见的统计建模方法及其具体应用方式&#xff1a; 目录 1.线性回归模型&#xff1a; ----python实现线性回归模型 -------使用NumPy…

牛客网刷题 | BC66 牛牛的通勤

目前主要分为三个专栏&#xff0c;后续还会添加&#xff1a; 专栏如下&#xff1a; C语言刷题解析 C语言系列文章 我的成长经历 感谢阅读&#xff01; 初来乍到&#xff0c;如有错误请指出&#xff0c;感谢&#xff01; 描述 牛牛的通勤路上有两…

yolov8旋转目标检测输出的角度转化为适合机械爪抓取的角度

1. 机械爪抓取时旋转的角度定义 以X轴正方向&#xff08;右&#xff09;为零度方向&#xff0c;角度取值范围[-90&#xff0c;90)。 确认角度的方法&#xff1a; 逆时针旋转X轴&#xff0c;X轴碰到矩形框长边时旋转过的角度记为angleX&#xff1a; 1.如果angleX小于90&#xf…

udp/tcp错误总结

udp tcp——多进程 tcp——多线程 tcp——线程池 tcp——守护进程 &#x1f386;udp  ✨pthread_create 错误总结  ✨LockGuard错误总结  ✨服务端需要写成多线程  ✨客户端也需要写成多线程  ✨多线程调试工具 &#x1f386;tcp  ✨tcp独有调试工具——telnet  ✨Threa…

Python的历史演变与作用

目录 1.概述 2.起源 3.发展阶段 4.Python 3的诞生 5.现状与未来 6.Python的作用 6.1.Web开发 6.2.数据科学与人工智能 ​​​​​​​6.3.自动化与脚本编程 ​​​​​​​6.4.教育与学习 ​​​​​​​6.5.其他领域 7.结语 1.概述 Python&#xff0c;一门富有表…

DSP开发实战教程-国产DSP替代进口TI DSP的使用技巧

1.替换CCS安装路径下的Flash.out文件 找到各自CCS的安装路径&#xff1a; D:\ti\ccs1230\ccs\ccs_base\c2000\flashAlgorithms 复制进芯电子国产DSP官网提供的配置文件 下载链接&#xff1a;https://mp.csdn.net/mp_download/manage/download/UpDetailed 2.替换原有文件 3.…

Thinkphp--in-sqlinjection

一、漏洞原理 在 Builder 类的 parseData 方法中&#xff0c;由于程序没有对数据进行很好的过滤&#xff0c;将数据拼接进 SQL 语句&#xff0c;导致 SQL注入漏洞 的产生。 影响版本 5.0.13<ThinkPHP<5.0.15 5.1.0<ThinkPHP<5.1.5 在相应的文件夹位置打开终端…
最新文章