【面试题】MyBatis面试题

article/2025/10/27 13:14:11

MyBatis想必大家都比较熟悉了吧,它底层封装了JDBC,用来与数据库进行连接。

这里我主要想讲一下MyBatis和MyBatis-plus,主要是想表达一下,据我的了解,这两个在公司中都有所使用,我只简略的学过MyBatis-plus。最直观的就是通用Mapper,为你省略了dao层的添加。当然,一些复杂的逻辑仍然需要你自定义Mapper。但我感觉plus对数据的操作的api相对以前更加复杂。整体而已,推荐大家深度学习MyBatis,在源码级别的学习中更加直白,简易。对于 MyBatis-plus大家只需要熟练使用常用方法。当然这只是我的一点意见。

1.什么是MyBatis

MyBatis是一款半自动化的ORM(对象关系映射)的软件。内部封装了JDBC,使得程序员在开发过程中省略了创建连接,加载驱动等操作,开发人员只需要关注sql语句本身。 MyBatis通过配置文件或者注解即可将数据库数据与pojo实体类联系起来

解释一下什么是对象关系映射

是一种为了解决关系型数据库数据与简单java对象的映射关系的技术

2.#{}和${}有什么区别

首先,他俩都是为了动态传递参数而存在的,是MyBatis实现动态sql的基础

#{}是预编译处理,将这部分先用?代替,调用PreparedStatement的set方法来赋值
${}是字符串替换,直接将这部分用括号内的实际内容代替

3.请说说MyBatis的工作原理

我们在实际开发过程中,都写过MyBatis的配置文件,对于 MyBatis的底层具体实现,就是从这里开始的。
1)读取MyBatis配置文件:mybatis-config.xml为MyBatis的全局配置文件,包含了MyBatis行为的设置和属性信息,例如数据库连接信息和映射文件

2)加载mapper.xml(SQL映射文件):该文件配置了操作数据库的SQL语句

3)构建会话工厂:创建会话工厂SqlSessionFactory

4)创建会话对象:由会话工厂生产sqlSession对象,该对象包含了执行sql语句的所有方法

5)Executor执行器:它将跟据sqlSession传递的参数动态的生成需要执行的sql语句,同时负责查询缓存的维护

6)MappedStatement对象:该对象是对映射信息的封装,用于存储要映射的SQL语句的id,参数等信息

7)输入参数映射:类似于JDBC对preparedStatement对象设置参数的过程

8)输出结果映射:类似于JDBC对结果集的解析过程

4.MyBatis是如何进行分页的?分页原理是什么

通过RowBounds进行逻辑分页。

物理分页:通过数据库limit

逻辑分页:通过代码实现。先查询出所有的数据,再跟据代码块的所需进行分页

还可以通过插件,例如Pagehepler

5. MyBatis是否支持延迟加载?如果支持,实现原理是什么

支持。

这个举例子再生活形象不过,就像用户与订单的关系,我们在用户中包含了订单的集合,但在显示时不会直接显示出来,但当用户点击订单时,再去查询,显示出来订单。这样可以减少数据库的压力。

实现原理:使用CGLIB创建目标对象的代理对象,当调用目标方法时,进入拦截器方法,把关联对象查询出来赋值。

6. MyBatis一二级缓存

一级缓存:sqlSession级别的缓存,sqlSession里的HashMap对查询过一次的数据进行存储,如果发出数据库增上改查的操作则取消存储
二级缓存:Mapper级别的,多个sqlSession去操作同一个Mapper的sql语句,多个sqlSession可以共用二级缓存
重要:其实解释到这里,对一些没看过源码的人来说并不友好,下面我对这些东西尽量给大家通俗的讲出来:

首先,session大家应该都了解,我们在Java Web的学习过程中接触过,它代表的是一次浏览器和服务器的交互的会话

sqlSession也是一个会话,每次连接一个数据库就会产生一个sqlSession会话。

下面截取了sqlSession的部分源码,sqlSession里封装了操作数据库的所有操作,还包括了Mapper代理对象

一级缓存:sqlSession级别的,也就是参数和sql语句完全一样的情况下,不需要再次查询数据库,那具体该如何判断呢

如果sqlSession调用了close()方法,会释放掉一级缓存

二级缓存:多个sqlSession可以共享一个mapper中的二级缓存区域,并且如果两个mapper的namespace相同,即使是两个mapper,那么这两个mapper中执行sql查询到的数据也将存在相同的二级缓存区域

下面我们以开启二级缓存进行测试

public class TestStudent extends BaseTest {

public static void selectAllStudent() {SqlSessionFactory sqlSessionFactory = getSession();SqlSession session = sqlSessionFactory.openSession();StudentMapper mapper = session.getMapper(StudentMapper.class);List<Student> list = mapper.selectAllStudents();System.out.println(list);//一级缓存测试List<Student> list2 = mapper.selectAllStudents();System.out.println(list2);session.commit();//创建了第二个sqlSession//二级缓存测试SqlSession session2 = sqlSessionFactory.openSession();StudentMapper mapper2 = session2.getMapper(StudentMapper.class);List<Student> list3 = mapper2.selectAllStudents();System.out.println(list3);System.out.println("第二次执行");List<Student> list4 = mapper2.selectAllStudents();System.out.println(list4);session2.commit();}public static void main(String[] args) {selectAllStudent();
}

}
我们调用了4次 selectAllStudents() ,但sql语句只执行了一次,两次为一级缓存,一次为二级缓存

7. MyBatis编程步骤

1)创建sqlSessionFactory对象

2)生产sqlSession对象

3)获取Mapper代理对象

4)执行数据库操作

5)执行成功,提交事务

6)执行失败,回滚事务

7)关闭会话

8.模糊查询like语句怎么写

在这里插入图片描述

9.在mapper中如何传递多个参数

在这里插入图片描述

10. MyBatis如何进行批量操作

在这里插入图片描述

11. MyBatis实现一对一,一对多有几种方式,怎么操作的

联合查询和嵌套查询

联合查询:几个表联合查询,只查询一次,通过在resultMap里面的association,collection节点配置一对一,一对多的类可以完成

嵌套查询:先查一个表,跟据这个表里面的结果的外键id,再去另一个表里面查询数据,也是通过配置association,collection,但另外一个表的查询通过select节点配置

12. MyBatis动态sql是做什么的,都有哪些动态sql,能简述一下动态sql的原理吗

MyBatis动态sql可以让我们在xml映射文件内,以标签的形式编写动态sql,完成逻辑判断和动态拼接sql的功能

实现原理:使用OGNL从sql参数对象中的计算表达式的值,跟据表达式的值动态拼接sql,以此来完成动态sql的功能

下面是我动态SQL的一些练习,方便大家理解

//1.if
//跟据username和sex来查询数据。如果username为空,则按sex查询,反之相同

我们先按原版写

select * from user where username = #{username} and sex = #{sex}

这样的话如果出现空值就没法搞了

select * from user where username=#{username}
	<if test="sex != null">and sex=#{sex}</if>

//2.where
//如果出现以and或or开头的他会剔除掉

select * from user


username=#{username}

	<if test="sex != null">and sex=#{sex}</if></where>

//3.choose
//choose标签,挺猛的,类似于java的switch,总能利用到一个搜索条件

select * from user



id=#{id}


and username=#{username}


and sex=#{sex}




按照顺序:
如果id不为空,sql语句为:select * from user where id=?
如果id为空,username不为空:select * from user where username=?;

//4.trim
//trim是一个格式化的标记,可以完成set或where标记的功能

select * from user


and username=#{username}


and sex=#{sex}



prefix:前缀
prefixOverrides:去掉第一个and或or

//5.foreach

select * from user



#{id}


13. MyBatis的架构设计是怎样的

1)API接口层:提供给外部使用的接口API,开发人员通过这些本地API来操纵数据库。接口层一接收到调用请求就会调用数据处理层来完成具体的数据处理

2)数据处理层:负责具体的SQL查找,SQL解析,SQL执行和执行结果映射处理。它主要的目的是跟据调用的请求完成一次数据库操作

3)基础支撑层:负责最基础的功能支撑,包括连接管理,事务管理,配置加载和缓存处理,这些都是公用的东西,将他们抽取出来作为最基础的组件。为上层的数据处理层提供最基础的支撑

4)引导层:加载xml配置和java配置

14.如何获取生成的主键

insert into user( user_name, user_password, create_time) values(#{userName}, #{userPassword} , #{createTime, jdbcType= TIMESTAMP})

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

select * from orders where order_id=#{id} <!–用id属性来映射主键字段–>

<!–用result属性来映射非主键字段,property为实体类属性名,column为数据库表中的属性–>


16.Dao接口的工作原理

Dao接口就是映射文件中的namespace的值,接口的方法名,就射映射文件MappedStatement的id值,接口方法内的参数,就是传递给sql的参数

Dao接口的工作原理就是JDK动态代理,MyBatis运行时会使用JDK动态代理为Dao接口生成代理对象proxy,代理对象会拦截接口方法调用,转而执行方法对应的sql语句,然后将sql执行结果返回

17.简述 MyBatis的插件运行原理,以及如何编写一个插件

Mybatis仅可以编写针对Executor、StatementHandler、ParameterHandler、ResultSetHandler这4种接口的插件,Mybatis使用JDK的动态代理,为需要拦截的接口生成代理对象以实现接口方法拦截功能,每当执行这4种接口对象的方法时,就会进入拦截方法,具体就是InvocationHandler的invoke()方法,当然,只会拦截那些你指定需要拦截的方法。

实现Mybatis的Interceptor接口并重写intercept()方法,然后在给插件编写注解,指定要拦截哪一个接口的哪些方法即可,最后在配置文件中配置你编写的插件。

另外,我自定义实现过一个简单的MyBatis,现在太忙了,过段时间给大家详细的讲解如何自定义实现简单的MyBatis。还有就是,我认为MyBatis是最好入门源码阅读的技术栈。我读过不少源码,但大多都理解的不清不楚。相对而言,MyBatis是结构划分最清晰的,整体难度也偏低的。十分推荐通过MyBatis入门阅读源码。后期我应该会上传MyBatis阅读源码的方法,帮助大家入门。

欢迎访问我的个人博客:gaoyuehao.vip。里面有大量的面试题内容哦~


http://chatgpt.dhexx.cn/article/7m5VOWMX.shtml

相关文章

MyBatis详细面试题以及答案

一&#xff0c;什么是MyBatis&#xff1f; 1&#xff0c;MyBatis是一个ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;它内部封装了JDBC,开发时只需要关注SQL语句本身&#xff0c;不需要花费精力去处理加载驱动&#xff0c;创建连接&#xff0c;创建statement等复杂…

【2022最新Java面试宝典】—— MyBatis面试题(37道含答案)

目录 一、MyBatis简介1. MyBatis是什么&#xff1f;2. Mybatis优缺点3. Hibernate 和 MyBatis 的区别4. 为什么说Mybatis是半自动ORM映射工具&#xff1f;它与全自动的区别在哪里&#xff1f;5. 传统JDBC开发存在什么问题&#xff1f;6. JDBC编程有哪些不足之处&#xff0c;MyB…

MyBatis常见面试题

目录 一、使用方面的问题 1、什么是MyBatis&#xff1f; 2、为什么说MyBatis是半ORM框架&#xff1f;与Hibernate有哪些不同&#xff1f; 3、MyBatis的优缺点&#xff1a;略 4、#{ } 和 ${ } 的区别是什么&#xff1f; 5、MyBatis是怎么解决实体类中的属性名和表中的字段…

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

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

MyBatis面试题总结

啃下MyBatis源码系列目录 啃下MyBatis源码 - 为什么要看MyBatis源码及源码结构 啃下MyBatis源码 - org.apache.ibatis.logging包源码分析 啃下MyBatis源码 - org.apache.ibatis.datasource包源码分析 啃下MyBatis源码 - org.apache.ibatis.cache包源码分析 啃下MyBatis源码 - M…

MyBatis 面试题(附答案解析)

MyBatis的实现逻辑 在 MyBatis 的初始化过程中&#xff0c;会生成一个 Configuration 全局配置对象&#xff0c;里面包含了所有初始化过程中生成对象根据 Configuration 创建一个 SqlSessionFactory 对象&#xff0c;用于创建 SqlSession “会话”通过 SqlSession 可以获取到 …

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 发行版,那么它已经…