Java面试题之MyBatis

简介: 关于Mybatis很多小伙伴都不陌生,其实它比Spring的架构简单多了,只要弄清楚,一条SQL是然后执行的。掌握其原理基本上就差不多了,其他一些譬如SQL注入这块的,在我们的日常开发中都知道的。

微信截图_20220531173728.png


一.题目介绍


1.题目来源


实际面试中遇到,形式的话有书面解答也有口述,一般侧重点是实现原理,基础架构


2.题目


1)Mybatis分页实现原理


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


3)Mybatis执行一条SQL的实现原理


二.具体解答


1.Mybatis分页实现原理


这块被问到的时候估计有一些人是懵的,心想分页不就是limit N,M 不就完事了,但是这完全没有说到重点。


1)Mybatis使用的是RowBounds对象进行分页,其分页插件比如PageHelper相信很多小伙伴也用过。


2)分页插件的原理:实现Mybatis提供的接口,实现自定义插件,在插件的拦截方法内拦截待执行的sql,然后重写 sql。 举例:select * from student,拦截 sql 后重写为:select t.* from (select * from student)t limit 0,10


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


经典面试题之一,但是同样的很多人没有大到重点,为什么${}容易被SQL注入


1)#{}是预编译处理(SQL执行器执行之前),${}是字符串替换(SQL执行器真正的执行过程中)。


2)Mybatis 在处理#{}时,会将SQL中的#{}替换为?号,调用PreparedStatement的set方法赋值,而在在处理{}时,就是把{}替换成变量的值,所以使用${}容易被SQL注入


3)所以针对使用${}容易被SQL注入的问题我们一般采用#{}


3.Mybatis执行一条SQL的实现原理


1.通过读取配置文件,调用SqlSessionFactory#openSession方法创建 SqlSession 对象,开启一次会话;


2.调用SqlSession#getMapper方法获取指定的 Mapper 接口对象,这里实际上将请求委托给 Configuration#getMapper方法执行,由前面分析映射文件解析过程时我们知道所有的Mapper接口都会注册到全局唯一的配置对象Configuration 的MapperRegistry 类型属性中;


3.MapperRegistry 在执行MapperRegistry#getMapper操作时会反射创建 Mapper 接口的动态代理对象并返回;


4.执行对应的数据库操作方法(例如UserMapper#selectByName),即调用 Mapper 接口动态代理对象的MapperProxy#invoke方法,在该方法中会获取封装执行方法的 MapperMethod 对象;


5.执行MapperMethod#execute方法,该方法会判定当前数据库操作类型(例如 SELECT),依据类型选择执行 SqlSession 对应的数据库操作方法;


6.SqlSession 会将数据库操作委托给具体的Executor执行。对于动态SQL语句而言,在这里会依据参数执行解析;对于查询语句而言,Executor 在条件允许的情况下会尝试先从缓存中进行查询,缓存不命中才会操作具体的数据库并更新缓存。然后就是集映射操作也在这里完成;


7.返回查询结果,一般是resultType接收,然后转换成相应的类


8.调用当前会话的SqlSession#close方法关闭本次会话


三.题后思考


关于Mybatis很多小伙伴都不陌生,其实它比Spring的架构简单多了,只要弄清楚,一条SQL是然后执行的。掌握其原理基本上就差不多了,其他一些譬如SQL注入这块的,在我们的日常开发中都知道的。

自由
+关注
目录
打赏
0
0
0
0
2
分享
相关文章
Java社招面试题:一个线程运行时发生异常会怎样?
大家好,我是小米。今天分享一个经典的 Java 面试题:线程运行时发生异常,程序会怎样处理?此问题考察 Java 线程和异常处理机制的理解。线程发生异常,默认会导致线程终止,但可以通过 try-catch 捕获并处理,避免影响其他线程。未捕获的异常可通过 Thread.UncaughtExceptionHandler 处理。线程池中的异常会被自动处理,不影响任务执行。希望这篇文章能帮助你深入理解 Java 线程异常处理机制,为面试做好准备。如果你觉得有帮助,欢迎收藏、转发!
109 14
Java 面试必问!线程构造方法和静态块的执行线程到底是谁?
大家好,我是小米。今天聊聊Java多线程面试题:线程类的构造方法和静态块是由哪个线程调用的?构造方法由创建线程实例的主线程调用,静态块在类加载时由主线程调用。理解这些细节有助于掌握Java多线程机制。下期再见! 简介: 本文通过一个常见的Java多线程面试题,详细讲解了线程类的构造方法和静态块是由哪个线程调用的。构造方法由创建线程实例的主线程调用,静态块在类加载时由主线程调用。理解这些细节对掌握Java多线程编程至关重要。
57 13
Java 高级面试技巧:yield() 与 sleep() 方法的使用场景和区别
本文详细解析了 Java 中 `Thread` 类的 `yield()` 和 `sleep()` 方法,解释了它们的作用、区别及为什么是静态方法。`yield()` 让当前线程释放 CPU 时间片,给其他同等优先级线程运行机会,但不保证暂停;`sleep()` 则让线程进入休眠状态,指定时间后继续执行。两者都是静态方法,因为它们影响线程调度机制而非单一线程行为。这些知识点在面试中常被提及,掌握它们有助于更好地应对多线程编程问题。
87 9
Java线程调度揭秘:从算法到策略,让你面试稳赢!
在社招面试中,关于线程调度和同步的相关问题常常让人感到棘手。今天,我们将深入解析Java中的线程调度算法、调度策略,探讨线程调度器、时间分片的工作原理,并带你了解常见的线程同步方法。让我们一起破解这些面试难题,提升你的Java并发编程技能!
103 16
Java社招面试中的高频考点:Callable、Future与FutureTask详解
大家好,我是小米。本文主要讲解Java多线程编程中的三个重要概念:Callable、Future和FutureTask。它们在实际开发中帮助我们更灵活、高效地处理多线程任务,尤其适合社招面试场景。通过 Callable 可以定义有返回值且可能抛出异常的任务;Future 用于获取任务结果并提供取消和检查状态的功能;FutureTask 则结合了两者的优势,既可执行任务又可获取结果。掌握这些知识不仅能提升你的编程能力,还能让你在面试中脱颖而出。文中结合实例详细介绍了这三个概念的使用方法及其区别与联系。希望对大家有所帮助!
202 60
Java面试必问!run() 和 start() 方法到底有啥区别?
在多线程编程中,run和 start方法常常让开发者感到困惑。为什么调用 start 才能启动线程,而直接调用 run只是普通方法调用?这篇文章将通过一个简单的例子,详细解析这两者的区别,帮助你在面试中脱颖而出,理解多线程背后的机制和原理。
78 12
【潜意识Java】深入理解MyBatis的Mapper层,以及让数据访问更高效的详细分析
深入理解MyBatis的Mapper层,以及让数据访问更高效的详细分析
112 1
【潜意识Java】MyBatis中的动态SQL灵活、高效的数据库查询以及深度总结
本文详细介绍了MyBatis中的动态SQL功能,涵盖其背景、应用场景及实现方式。
164 6
【潜意识Java】深入理解MyBatis,从基础到高级的深度细节应用
本文详细介绍了MyBatis,一个轻量级的Java持久化框架。内容涵盖MyBatis的基本概念、配置与环境搭建、基础操作(如创建实体类、Mapper接口及映射文件)以及CRUD操作的实现。此外,还深入探讨了高级特性,包括动态SQL和缓存机制。通过代码示例,帮助开发者更好地掌握MyBatis的使用技巧,提升数据库操作效率。总结部分强调了MyBatis的优势及其在实际开发中的应用价值。
41 1
Java后端开发-使用springboot进行Mybatis连接数据库步骤
本文介绍了使用Java和IDEA进行数据库操作的详细步骤,涵盖从数据库准备到测试类编写及运行的全过程。主要内容包括: 1. **数据库准备**:创建数据库和表。 2. **查询数据库**:验证数据库是否可用。 3. **IDEA代码配置**:构建实体类并配置数据库连接。 4. **测试类编写**:编写并运行测试类以确保一切正常。
93 2
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等