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注入这块的,在我们的日常开发中都知道的。

目录
相关文章
|
19天前
|
缓存 Java 关系型数据库
【Java面试题汇总】ElasticSearch篇(2023版)
倒排索引、MySQL和ES一致性、ES近实时、ES集群的节点、分片、搭建、脑裂、调优。
【Java面试题汇总】ElasticSearch篇(2023版)
|
19天前
|
设计模式 Java 关系型数据库
【Java笔记+踩坑汇总】Java基础+JavaWeb+SSM+SpringBoot+SpringCloud+瑞吉外卖/谷粒商城/学成在线+设计模式+面试题汇总+性能调优/架构设计+源码解析
本文是“Java学习路线”专栏的导航文章,目标是为Java初学者和初中高级工程师提供一套完整的Java学习路线。
174 37
|
19天前
|
设计模式 安全 算法
【Java面试题汇总】设计模式篇(2023版)
谈谈你对设计模式的理解、七大原则、单例模式、工厂模式、代理模式、模板模式、观察者模式、JDK中用到的设计模式、Spring中用到的设计模式
【Java面试题汇总】设计模式篇(2023版)
|
19天前
|
存储 关系型数据库 MySQL
【Java面试题汇总】MySQL数据库篇(2023版)
聚簇索引和非聚簇索引、索引的底层数据结构、B树和B+树、MySQL为什么不用红黑树而用B+树、数据库引擎有哪些、InnoDB的MVCC、乐观锁和悲观锁、ACID、事务隔离级别、MySQL主从同步、MySQL调优
【Java面试题汇总】MySQL数据库篇(2023版)
|
19天前
|
存储 缓存 NoSQL
【Java面试题汇总】Redis篇(2023版)
Redis的数据类型、zset底层实现、持久化策略、分布式锁、缓存穿透、击穿、雪崩的区别、双写一致性、主从同步机制、单线程架构、高可用、缓存淘汰策略、Redis事务是否满足ACID、如何排查Redis中的慢查询
【Java面试题汇总】Redis篇(2023版)
|
19天前
|
缓存 前端开发 Java
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
Soring Boot的起步依赖、启动流程、自动装配、常用的注解、Spring MVC的执行流程、对MVC的理解、RestFull风格、为什么service层要写接口、MyBatis的缓存机制、$和#有什么区别、resultType和resultMap区别、cookie和session的区别是什么?session的工作原理
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
|
19天前
|
缓存 Java 数据库
【Java面试题汇总】Spring篇(2023版)
IoC、DI、aop、事务、为什么不建议@Transactional、事务传播级别、@Autowired和@Resource注解的区别、BeanFactory和FactoryBean的区别、Bean的作用域,以及默认的作用域、Bean的生命周期、循环依赖、三级缓存、
【Java面试题汇总】Spring篇(2023版)
|
19天前
|
存储 缓存 监控
【Java面试题汇总】JVM篇(2023版)
JVM内存模型、双亲委派模型、类加载机制、内存溢出、垃圾回收机制、内存泄漏、垃圾回收流程、垃圾回收器、G1、CMS、JVM调优
【Java面试题汇总】JVM篇(2023版)
|
8天前
|
消息中间件 NoSQL Java
Java知识要点及面试题
该文档涵盖Java后端开发的关键知识点,包括Java基础、JVM、多线程、MySQL、Redis、Spring框架、Spring Cloud、Kafka及分布式系统设计。针对每个主题,文档列举了重要概念及面试常问问题,帮助读者全面掌握相关技术并准备面试。例如,Java基础部分涉及面向对象编程、数据类型、异常处理等;JVM部分则讲解内存结构、类加载机制及垃圾回收算法。此外,还介绍了多线程的生命周期、同步机制及线程池使用,数据库设计与优化,以及分布式系统中的微服务、RPC调用和负载均衡等。
|
SQL 缓存 安全
Java高频面试题目
面试时面试官最常问的问题总结归纳!
133 0
下一篇
无影云桌面