MyBatis 面试题(附答案解析)

article/2025/10/27 16:47:51

MyBatis的实现逻辑

  1. 在 MyBatis 的初始化过程中,会生成一个 Configuration 全局配置对象,里面包含了所有初始化过程中生成对象
  2. 根据 Configuration 创建一个 SqlSessionFactory 对象,用于创建 SqlSession “会话”
  3. 通过 SqlSession 可以获取到 Mapper 接口对应的动态代理对象,去执行数据库的相关操作
  4. 动态代理对象执行数据库的操作,由 SqlSession 执行相应的方法,在他的内部调用 Executor 执行器去执行数据库的相关操作
  5. 在 Executor 执行器中,会进行相应的处理,将数据库执行结果返回

MyBatis的缓存实现逻辑

MyBatis 提供了一级缓存和二级缓存

在 MyBatis 地开启一个 SqlSession 会话时,都会创建一个 Executor 执行器对象

  • 一级缓存在 Executor 执行器(SimpleExecutor)中有一个 Cache 对象中,默认就是一个 HashMap 存储缓存数据,执行数据库查询操作前,如果在一级缓存中有对应的缓存数据,则直接返回,不会去访问数据库默认的缓存区域为SESSION,表示开启一级缓存,可以设置为STATEMENT,执行完查询后会清空一级缓存,所有的数据库更新操作也会清空一级缓存缺陷:在多个 SqlSession 会话时,可能导致数据的不一致性,某一个 SqlSession 更新了数据而其他 SqlSession 无法获取到更新后的数据,出现数据不一致性,这种情况是不允许出现了,所以我们通常选择“关闭”一级缓存
  • 二级缓存在 Executor 执行器(CachingExecutor)中有一个 TransactionalCacheManager 对象中,可以在一定程度上解决的一级缓存中多个 SqlSession 会话可能会导致数据不一致的问题,就是将一个 XML 映射文件中定义的缓存对象放在全局对象中,对于同一个 Mapper 接口都是使用这个 Cache 对象,不管哪个 SqlSession 都是使用该 Cache 对象执行数据库查询操作前,如果在二级缓存中有对应的缓存数据,则直接返回,没有的话则去一级缓存中获取,如果有对应的缓存数据,则直接返回,不会去访问数据库默认全局开启,需要在每个 XML 映射文件中定义缺陷:对于不同的 XML 映射文件,如果某个的 XML 映射文件修改了相应的数据,其他的 XML 映射文件获取到的缓存数据就可能不是最新的,也出现了脏读的问题,当然你可以所有的 XML 映射文件都通过<cache-ref />来使用同一个 Cache 对象,不过这样太局限了,且缓存的数据仅仅是保存在了本地内存中,对于当前高并发的环境下是无法满足要求的,所以我们通常不使用MyBatis的缓存

所以对于 MyBatis 中的缓存,我认为是存在一定的缺陷,无法在正式的生产环境使用,如果需要使用缓存,可以参考我的另一篇文档《JetCache源码分析》

#{} 和 ${} 的区别是什么?

两者在 MyBatis 中都可以作为 SQL 的参数占位符,在处理方式上不同

  • #{}:在解析 SQL 的时候会将其替换成 ? 占位符,然后通过 JDBC 的 PreparedStatement 对象添加参数值,这里会进行预编译处理,可以有效地防止 SQL 注入,提高系统的安全性
  • ${}:在 MyBatis 中带有该占位符的 SQL 片段会被解析成动态 SQL 语句,根据入参直接替换掉这个值,然后执行数据库相关操作,存在 SQL注入 的安全性问题

MyBatis中自定义标签的执行原理

MyBatis 提供了以下几种动态 SQL 的标签:<if />、<choose />、<when />、<otherwise />、<trim />、<where />、<set />、<foreach />、<bind />

在 MyBatis 的初始化过程中的解析 SQL 过程中,会将定义的一个 SQL 解析成一个个的 SqlNode 对象,当需要执行数据库查询前,需要根据入参对这些 SqlNode 对象进行解析,使用OGNL表达式计算出结果,然后根据结果拼接对应的 SQL 片段,以此完成动态 SQL 的功能

如何使用可以参考MyBatis官方文档

简述Mapper接口的工作原理

在 MyBatis 的初始化过程中,每个一个 XML 映射文件中的<select />、<insert />、<update />、<delete />标签,会被解析成一个 MappedStatement 对象,对应的 id 就是 XML 映射文件配置的 namespace+'.'+statementId,这个 id 跟 Mapper 接口中的方法进行关联,这里就引申了另外一个问题

同一个 Mapper 接口中为什么不能定义重载方法?
因为 Mapper 接口中的方法是通过 接口名称+'.'+方法名 去找到对应的 MappedStatement 对象,如果方法名相同,则对应的 MappedStatement 对象就是同一个,就存在问题了,所以同一个 Mapper 接口不能定义重载的方法

每个 Mapper 接口都会创建一个动态代理对象(JDK 动态代理),代理类会拦截接口的方法,找到对应的 MappedStatement 对象,然后执行数据库相关操作

执行逻辑如下:

其中 MapperProxy 为 Mapper 接口的动态代理对象的代理类

在Spring中Mapper接口是如何被注入的?

通过 SqlSession 的 getMapper(Class<T> type) 方法,可以获取到 Mapper 接口的动态代理对象,那么在 Spring 中是如何将 Mapper 接口注入到其他 Spring Bean 中的呢?

在 MyBatis 的 MyBatis-Spring 集成 Spring 子项目中,通过实现 Spring 的
BeanDefinitionRegistryPostProcessor 接口,实现它的
postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) 方法,也就是在 Spring 完成 BeanDefinition 的初始化工作后,会将 Mapper 接口也解析成 BeanDefinition 对象注册到 registry 注册表中,并且会修改其 beanClass 为 MapperFactoryBean 类型,还添加了一个入参为 Mapper 接口的 Class 对象的名称

这样 Mapper 接口会对应一个 MapperFactoryBean 对象,由于这个对象实现了 FactoryBean 接口,实现它的 getObject() 方法,该方法会通过 SqlSession 的 getMapper(Class<T> type) 方法,返回该 Mapper 接口的动态代理对象,所以在 Spring Bean 中注入的 Mapper 接口时,调用其 getObeject() 方法,拿到的是 Mapper 接口的动态代理对象

在Mapper接口中是否可以有重载方法?

不可以,参考Mapper接口的工作原理这个问题

当实体类中的属性名和表中的字段名不一样 ,怎么办?

  1. 通过 AS 关键字为字段名设置一个别名与属性名对应
  2. 通过 <resultMap> 来映射字段名和实体类属性名的一一对应的关系,通过配置 property 和 column 属性,如下:

3.是第一种的特殊情况。大多数场景下,数据库字段名和实体类中的属性名差,主要是前者为下划线风格,后者为驼峰风格。在这种情况下,可以开启 MyBatis 的mapUnderscoreToCamelCase配置,实现自动的下划线转驼峰的功能,如下:

如何获取自动生成的键值?

不同的数据库,获取自动生成的(主)键值的方式是不同的

MySQL 有两种方式获取自动生成的键值,如下:

  1. 在 <insert /> 标签中添加useGeneratedKeys="true"等属性

3.在 <insert /> 标签内添加<selectKey />标签

Oracle 也有两种方式,序列触发器,基于序列,根据 <selectKey /> 执行的时机,也有两种方式,如下:

Mybatis有哪些Executor执行器?

  • SimpleExecutor(默认):每执行一次数据库的操作,就创建一个 Statement 对象,用完立刻关闭 Statement 对象。
  • ReuseExecutor:执行数据库的操作,以 SQL 作为 key 查找缓存的 Statement 对象,存在就使用,不存在就创建;用完后,不关闭 Statement 对象,而是放置于缓存 Map<String, Statement> 内,供下一次使用,就是重复使用 Statement 对象
  • BatchExecutor:执行数据库更新操作(没有查询操作,因为 JDBC 批处理不支持查询操作),将所有 SQL 都添加到批处理中(通过 addBatch 方法),等待统一执行(使用 executeBatch 方法)。它缓存了多个 Statement 对象,每个 Statement 对象都是调用 addBatch 方法完毕后,等待一次执行 executeBatch 批处理。实际上,整个过程与 JDBC 批处理是相同
  • CachingExecutor:在上述的三个执行器之上,增加二级缓存的功能

MyBatis的延迟加载原理

Mybatis是如何进行分页的?

Mybatis如何处理include标签的?

MyBatis与Hibernate有哪些不同?

JDBC编程有哪些不足之处,MyBatis是如何解决这些问题的?

Mybatis比IBatis比较大的几个改进是什么?

可以说这一篇(宝典),熟知本文80%以上内容,找个开发工作问题不大。对3-5年经验的朋友, 也是快速温习的利器!本次的内容大致的就介绍到这里啦,由于内容太多,只能简单介绍到这里,如有需要以上内容的完整版,大家可以私信我获取哦~~后台关注我后私信回复:【666】即可获取

学习更多JAVA知识与技巧,关注与私信博主(666)


http://chatgpt.dhexx.cn/article/OsWVCXYU.shtml

相关文章

MyBatis面试题(2020最新版)

Java面试总结&#xff08;2021优化版&#xff09;已发布在个人微信公众号【技术人成长之路】&#xff0c;优化版首先修正了读者反馈的部分答案存在的错误&#xff0c;同时根据最新面试总结&#xff0c;删除了低频问题&#xff0c;添加了一些常见面试题&#xff0c;对文章进行了…

【2021最新版】MyBatis面试题总结(38道题含答案解析)

文章目录 1、什么是Mybatis&#xff1f;2、Mybaits的优点&#xff1f;3、MyBatis框架的缺点&#xff1f;4、MyBatis框架适用场合5、MyBatis与Hibernate有哪些不同&#xff1f;6、#{} 和${}的区别是什么&#xff1f;7、当实体类中的属性名和表中的字段名不一样&#xff0c;怎么办…

Mybatis经典面试题汇总

一、什么是Mybatis? 答: 1. Mybatis是一个半orm&#xff08;对象映射&#xff09;框架&#xff0c;它内部封装了JDBC&#xff0c;开发时只需要关注SQL的本身&#xff0c;不需要 加载驱动、创建连接、写statement的过程&#xff0c;程序员直接编写原生的sql,灵活性高。 2. Myba…

MyBatis面试题

目录 硅谷 一 . MyBatis中 #{}和${}的区别是什么&#xff1f; 二 .Mybatis 结果集的映射方式有几种&#xff0c;并分别解释每种映射方式如何使用。 三 .简述MyBatis的单个参数、多个参数如何传递及如何取值。 四 .MyBatis如何获取自动生成的(主)键值? 五. 简述Mybatis的…

2023MyBatis全新面试题【30题】

一、介绍下MyBatis中的工作原理 1。介绍MyBatis的基本情况&#xff1a;ORM 2。原理&#xff1a; MyBatis框架的初始化操作处理SQL请求的流程 1.系统启动的时候会加载解析全局配置文件和对应映射文件。加载解析的相关信息存储在 Configuration 对象 Testpublic void test1(…

马哈鱼数据血缘分析工具

1. 马哈鱼数据血缘分析工具简介 马哈鱼数据血缘分析工具&#xff08;英文名称为 Gudu SQLFlow &#xff09;是一款用于分析 SQL 语句&#xff0c;并发现其中数据血缘关系的分析软件&#xff0c;经常和元数据管理工具一起使用&#xff0c;是企业数据治理的基础工具。 如果你对 …

数据分析师常用工具有哪些?初学者必看

我给你一份数据分析师常用工具指南&#xff0c;按照这份指南&#xff0c;小白也能成为数据分析高手&#xff01; 这是一份入门到熟练的工具指南&#xff0c;并不包含数据挖掘等高阶内容。 Step1&#xff1a;Excel学习掌握 所用的工具正是职场中最常用的Excel&#xff01; ①重点…

京东数据分析工具推荐(京东第三方数据平台)

京东平台的店铺众多&#xff0c;同行数不胜数。作为商家&#xff0c;如果连自己竞争对手的情况都不知道的话,很难在这个平台存活下去。 那么&#xff0c;这次鲸参谋就来重点说一下我们的京东数据分析工具里的“竞品分析”功能。 竞品分析&#xff0c;主要是对京东店铺运营期间竞…

2019商业数据分析软件有哪些

在当下这个快速发展的信息化时代&#xff0c;对于企业经营来讲&#xff0c;掌握一些大数据分析软件工具来支持经营决策也是至关重要的。 2019年商业数据分析软件有哪些呢&#xff1f;本文列出了市面上最主要的几款数据分析软件。 1.FineBI 目前国内数据分析的佼佼者。FineBI是…

京东数据分析工具(京东销售数据如何查询)

相信很多京东或者天猫商家都会有这样的需求&#xff1a;想要查看各品类的销售数据&#xff0c;行业大盘数据、竞品的各项销售数据、各品类下的爆款商品数据、竞品店铺的数据等等&#xff0c;一些商智无法满足的数据不知道去哪里可以看到。 实际上&#xff0c;可以体验一下那些…

常用的5种数据分析方法有哪些?

常用的数据分析方法有5种。 1.对比分析法 对比分析法指通过指标的对比来反映事物数量上的变化&#xff0c;属于统计分析中常用的方法。常见的对比有横向对比和纵向对比。 横向对比指的是不同事物在固定时间上的对比&#xff0c;例如&#xff0c;不同等级的用户在同一时间购买商…

抖音短视频数据分析报告工具

现下&#xff0c;短视频行业的快速发展&#xff0c;产生了许多短视频领域的创业者。大家都知道&#xff0c;想要做一个有价值的抖音账号&#xff0c;内容质量方面必须要好&#xff0c;除此之外&#xff0c;当然每天的日常的数据分析也是非常的重要。可以通过其他专业的辅助分析…

python数据分析工具

文章目录 python数据分析工具NumPyScipyMatplotlibpandasStatsModelsscikit-learnKerasGensim python数据分析工具 python本身的数据分析功能并不强&#xff0c;需要安装一些第三方扩展库来增强其相应的功能。 python数据分析与挖掘相关的扩展库&#xff1b; 扩展库简介NumP…

Python常用数据分析工具

Python数据分析工具 Python 本身的数据分析功能不强,需要安装一些第三方扩展库来增强它的能力。常用 的库有Numpy 、Scipy 、Matplotlib 、Pandas 、Scikit-Learn 、Keras 和Gensim 等,下面将对 这些库的安装和使用进行简单的介绍。如果你安装的是Anaconda 发行版,那么它已经…

wps2019数据分析加载项_wpsexcel数据分析工具在哪里

WPS中Excel表格的功能非常强大&#xff0c;不仅仅能够统计数据&#xff0c;而且还可以分析数据&#xff0c;这也是我们处理大量数据的最快捷的方法&#xff0c;感兴趣的小伙伴可以来看看哦。 WPS中如何将表格中的数据在表格中以柱状图显示 运用条件格式中数据条即可达到效果 如…

6个常用大数据分析工具集锦

大数据是一个含义广泛的术语&#xff0c;是指数据集&#xff0c;如此庞大而复杂的&#xff0c;他们需要专门设计的硬件和软件工具进行处理。该数据集通常是万亿或EB的大小。这些数据集收集自各种各样的来源&#xff1a;传感器&#xff0c;气候信息&#xff0c;公开的信息&#…

数据分析的类型有哪些?

数据分析的类别 维度一 在统计学领域&#xff0c;有些学者根据分析的方法和目的&#xff0c;分析可以被划分为描述性分析&#xff08;descri-ptive analytics&#xff09;、预测性分析&#xff08;predictive analytics&#xff09;和规范性分析&#xff08;prescriptive ana…

BI数据分析工具

数据分析是指用适当的统计方法对收集的大量数据进行分析&#xff0c;将对它们加以汇总和理解并消化&#xff0c;以求最大的开发数据的功能&#xff0c;发挥数据的作用。数据分析是为了提取有用信息和形成结论而对数据加以详细研究概括总结的过程。 今天小编介绍的是现在市面上…

盘点6个主流的数据分析工具,及优缺点对比

本文来跟大家聊聊关于数据分析工具的事儿。 市面上用来做数据分析的工具蛮多的&#xff0c;包括Python、Excel、SPSS、MATLAB、R、BI等等&#xff0c;以下挑几个比较主流的工具&#xff0c;尽量客观的聊聊他们的优缺点。 01 Microsoft Excel 想要了解如何用Excel做数据分析的…

数据分析的常用工具有哪些

大数据分析是研究大量的数据的过程中寻找模式&#xff0c;相关性和其他有用的信息&#xff0c;可以帮助企业更好地适应变化&#xff0c;并做出更明智的决策。下面整理了一些大数据分析能用到的工具&#xff0c;助力大家更好的应用大数据技术。 一、hadoop Hadoop 是一个能够…