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

news2024/11/18 19:49:39

面试必须要看看

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.coloradmin.cn/o/1629667.html

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

相关文章

PotatoPie 4.0 实验教程(25) —— FPGA实现摄像头图像直方图均衡变换

图像的直方图均衡是什么&#xff1f; 图像的直方图均衡是一种用于增强图像对比度的图像处理技术。在直方图均衡中&#xff0c;图像的像素值被重新分配&#xff0c;以使得图像的直方图变得更均匀&#xff0c;即各个像素值的分布更加平衡。这意味着直方图中每个像素值的频率大致…

图像处理到神经网络:线性代数的跨领域应用探索

作者介绍&#xff1a;10年大厂数据\经营分析经验&#xff0c;现任大厂数据部门负责人。 会一些的技术&#xff1a;数据分析、算法、SQL、大数据相关、python 欢迎加入社区&#xff1a;码上找工作 作者专栏每日更新&#xff1a; LeetCode解锁1000题: 打怪升级之旅 python数据分析…

JavaScript云LIS系统源码 前端框架JQuery+EasyUI+后端框架MVC+SQLSuga大型医院云LIS检验系统源码 可直接上项目

JavaScript云LIS系统源码 前端框架JQueryEasyUI后端框架MVCSQLSuga大型医院云LIS检验系统源码 可直接上项目 云LIS系统概述&#xff1a; 云LIS是为区域医疗提供临床实验室信息服务的计算机应用程序&#xff0c;可协助区域内所有临床实验室相互协调并完成日常检验工作&#xff…

02-JVM学习记录-运行时数据区

二、运行时数据区 每个JVM只有一个Runtime实例&#xff0c;只有一个运行时数据区。 虚拟机栈、堆、方法区最重要 方法区和堆与虚拟机的生命周期相同&#xff08;随虚拟机启动而创建&#xff0c;虚拟机退出而销毁&#xff09;&#xff0c;程序计数器、虚拟机栈、本地方法栈生命…

AcrelEMS-MH民航机场智慧能源管平台解决方案【可靠供电/降低能耗/高效运维】

民航机场行业背景 自2012年以来&#xff0c;我国民航运输规模出现了显著增长&#xff0c;旅客运输量&#xff1a;从2012年的3.19亿人次上升至2019年的6.6亿人次&#xff08;注&#xff1a;为剔除疫情影响&#xff0c;此处采取疫情前2019年的数据&#xff0c;下同&#xff09;&…

Docker数据管理与Dockerfile镜像创建

前言 在容器化环境中&#xff0c;如何有效地管理和持久化数据成为了开发人员和运维团队面临的挑战之一&#xff1b;另一方面&#xff0c;镜像的创建是构建容器化应用的基础。优化的镜像设计可以提高部署效率和应用性能&#xff0c;减少资源消耗和运行成本。本文将介绍 Docker …

设计模式之工厂模式FactoryPattern(二)

一、简单工厂 package com.xu.demo.factoryPattern;/*** 简单工厂模式类*/ public class SimpleFactoryPattern {public static Phone create(String name) {//根据输入对象名称判断返回相匹配的对象if("IPhone".equals(name)) {//返回对象return new IPhone();}else…

Visual Studio导入libtorch(Cuda版)

Visual Studio导入libtorch&#xff08;Cuda版&#xff09; 一、安装 官网&#xff1a;https://pytorch.org/get-started/locally/ 相应地选择并下载 二、环境变量配置 解压zip&#xff0c;得到libtorch文件夹&#xff0c;将libtorch\lib和libtorch\bin对应路径添加到系统环…

低频量化周报

低频量化日报&#xff08;2024-04-26&#xff09; 指数分位值指数风险溢价比小规模配债<5亿配债完整数据 整体情况5 批文通过4 发哥通过3 交易所受理2 股东大会通过1 董事会预案可转债策略 双低策略四因子策略网格策略ETF抄底指标<3历史操作记录本周心得最后 指数分位值 …

Linux:Apache和Nginx的区别

Linux&#xff1a;Apache和Nginx的区别 图示工作过程 apache使用的是进程负责到底的工作流程&#xff0c;其特点是稳定&#xff1b;nginx使用了连接复用器这个结构&#xff0c;可以实现一个进程只负责给存储单元提出需求&#xff0c;而不需要负责到底&#xff0c;这样大大提高…

Codeforces Round 941 (Div. 1) E. Connected Cubes(构造)

题目 思路来源 官方题解 题解 可以看下官方题解的7张图&#xff0c;还是比较清晰的&#xff0c;这里直接粘贴一下 来源&#xff1a;Codeforces Round #941 (Div. 1, Div. 2) Editorial - Codeforces &#xff08;1&#xff09;原来的图 &#xff08;2&#xff09;对于偶数行…

【经验分享】MySQL集群部署一:主从模式

目录 前言一、基本介绍1.1、概念1.2、执行流程 二、部署2.1、通用配置2.2、主节点配置2.3、从节点配置2.4、主从测试2.5、谈一谈主节点历史数据同步问题 前言 MySQL的部署模式常见的包括以下几种&#xff1a; 独立服务器部署主从复制部署高可用性集群&#xff08;HA&#xff…

【MRI重建】Cartesian采样中data consistency 常规数据一致性实现(pytorch)

关于 在MRI重建中,data consistency 可以帮助加快MRI图像重建和减少模型重建带来的重建误差。 工具 方法实现 x_rec: 重建图像, (batch_size,2,H,W) mask: 欠采样模版,(batch_size,2,H,W) k_un: 真实欠采样采集数据, (batch_size,2,H,W) torch.view_as_complex: 将实数数据…

【图解计算机网络】TCP协议三次握手与四次挥手

TCP协议三次握手与四次挥手 三次握手流程为什么是三次握手&#xff0c;而不是两次或四次四次挥手流程TIME_WAIT 为什么要等待 2MSL为什么握手是三次&#xff0c;挥手是四次&#xff1f; 三次握手流程 首先是客户端&#xff08;也就是我们的浏览器&#xff09;发送一个SYN标志位…

数字电路-可预置倒计时器Multisim仿真

数字电路之于FPGA意义重大。本可预置倒计时器设计采用40106作为振荡电路&#xff0c;由74LSl92、74LS47D和七段共阴数码管构成计时电路&#xff0c;具有启动/预置、暂停/继续计时和报警功能。紫色文字是超链接&#xff0c;点击自动跳转至相关博文。持续更新&#xff0c;原创不易…

鸿蒙内核源码分析(进程管理篇) | 谁在管理内核资源?

官方基本概念 从系统的角度看&#xff0c;进程是资源管理单元。进程可以使用或等待CPU、使用内存空间等系统资源&#xff0c;并独立于其它进程运行。 OpenHarmony内核的进程模块可以给用户提供多个进程&#xff0c;实现了进程之间的切换和通信&#xff0c;帮助用户管理业务程序…

rust前端web开发框架yew使用

构建完整基于 rust 的 web 应用,使用yew框架 trunk 构建、打包、发布 wasm web 应用 安装后会作为一个系统命令&#xff0c;默认有两个特性开启 rustls - 客户端与服务端通信的 tls 库update_check - 用于应用启动时启动更新检查&#xff0c;应用有更新时提示用户更新。nati…

MySQL数据库常见SQL语句宝典

一 、常用操作数据库的命令 1.查看所有的数据库 : show databases;2.创建一个数据库 : create database if not exists 数据库名;3.删除一个数据库 : drop database if exists 数据库名;4.选择一张表 (注意在建表之前必须要选择数据库) : use 表名;* --tab 键的上面&#x…

【学习笔记三十】EWM和PP集成的后台配置和前台演示

一、EWM和PP集成概述 在S4HANA版本中&#xff0c;PP模块强化了生产线的概念&#xff0c;并与EWM集成&#xff0c;使用生产供应区&#xff08;PSA&#xff09;的功能。PSA的基本配置包括在ERP系统中创建PSA、定义工作中心、将PSA分配给工作中心、在EWM中创建PSA、匹配ERP和EWM中…

【JavaSE】_继承

目录 1.继承的概念 2. 继承语法 3. 父类成员的访问 3.1 子类中访问父类的成员变量 3.1.1 子类和父类不存在同名成员变量 3.1.2 子类和父类成员变量同名 3.2 子类中访问父类的成员方法 3.2.1 成员方法名不同 3.2.2 成员方法名相同 4. super关键字 5. 子类构造方法 6.…