面试官:精通 Mybatis?请回答下这几个问题
点关注,不迷路;持续更新Java架构相关技术及资讯热文!!!
Mybatis是现在非常主流的持久层框架,虽然平时用的多,但是其中几个细节的问题,能说出个所以然来不?

一、最常见,参数中 #{} 和 ${} 有什么区别?
1、要点:
#{}是编译处理,可以防止 SQL 注入攻击。${}是静态文本替换,有 SQL 注入攻击风险。
2、详情:
#{}会将sql语句编译好并使用占位符?,然后再进行取值(值转换成字符串)很大的程度防止sql注入。${}先取值(不做任何处理直接引用)然后再去编译sql语句,无法防止sql注入,一般用于传入数据库对象,比如表名之类的。#{}是sql的参数占位符,Mybatis会将sql中的#{}替换为 ?号,会编译处理。在sql执行前会使用PreparedStatement的参数设置方法,按序给sql的 ?号占位符设置参数值。{driver}会被静态替换为com.mysql.jdbc.Driver。
二、请解释下 Mybatis 的缓存机制?
缓存是一个持久层框架非常重要的一个功能,她可以减轻数据库访问的压力,提高应用的性能。Mybatis 的缓存分为两级:一级缓存和二级缓存。
- 一级缓存是 SqlSession 级别的缓存,缓存的数据只在 SqlSession 内有效。
- 二级缓存是 Mapper 级别的缓存,同一个namespace公用这一个缓存,所以对 SqlSession 是共享的。

1、一级缓存
Mybatis 的一级缓存是SqlSession级别的缓存,默认开启。她是基于 PerpetualCache 的 HashMap 本地缓存,其存储作用域为 Session。
在操作数据库的时候需要先创建SqlSession会话对象,在对象中有一个HashMap用于存储缓存数据,此HashMap是当前会话对象私有的,别的SqlSession会话对象无法访问。当 Session flush 或 close 之后,该Session中的所有缓存就会被清空。
缓存过程:
- 第一次执行select完毕会将查到的数据写入SqlSession内的HashMap中缓存起来。
- 第二次执行select会从缓存中查数据,如果select相同且传参数一样,那么就能从缓存中返回数据。
2、二级缓存
Mybatis 的二级缓存是 Mapper 级别的缓存,默认不开启,需手工配置。其存储作用域为 Mapper,也就是同一个 namespace 的 mappe.xml。
二级与一级缓存其机制相同,默认也是采用 PerpetualCache,HashMap存储,不同在于其存储作用域为 Mapper(Namespace),并且可自定义存储源,如 Ehcache、Hazelcast等。当多个SqlSession使用同一个Mapper操作数据库的时候,得到的数据会缓存在同一个二级缓存区域。
缓存流程:
- 当一个sqlseesion执行了一次select后,在关闭此session的时候,会将查询结果缓存到二级缓存。
- 当另一个sqlsession执行select时,首先会在他自己的一级缓存中找,如果没找到,就回去二级缓存中找,找到了就返回,就不用再去数据库了。
3、缓存注意事项
- 如果SqlSession执行了DML操作(insert、update、delete),并commit了,那么mybatis就会清空当前SqlSession缓存中的所有缓存数据,这样可以保证缓存中的存的数据永远和数据库中一致,避免出现脏读。
- 一级缓存默认开启,不需要手工配置;二级缓存默认不开启,需要手工配置。
- mybatis的缓存是基于[namespace:sql语句:参数]来进行缓存的,也就是说SqlSession的HashMap存储缓存数据时,是使用[namespace:sql:参数]作为key,查询返回的语句作为value保存的。

好了,时间关系,今天先记录着两个常见问题吧。上面的两个 Mybatis 的问题你都清楚了吗。

面试官:精通 Mybatis?请回答下这几个问题的更多相关文章
- 8年经验面试官详解 Java 面试秘诀
作者 | 胡书敏 责编 | 刘静 出品 | CSDN(ID:CSDNnews) 本人目前在一家知名外企担任架构师,而且最近八年来,在多家外企和互联网公司担任Java技术面试官,前后累计面试了有两三 ...
- Android开发面试经——6.常见面试官提问Android题②(更新中...)
版权声明:本文为寻梦-finddreams原创文章,请关注:http://blog.csdn.net/finddreams 关注finddreams博客:http://blog.csdn.net/fi ...
- Java面试官最爱问的volatile关键字
在Java的面试当中,面试官最爱问的就是volatile关键字相关的问题.经过多次面试之后,你是否思考过,为什么他们那么爱问volatile关键字相关的问题?而对于你,如果作为面试官,是否也会考虑采用 ...
- <转载>面试官,不要再问我三次握手和四次挥手
版权声明:本文为CSDN博主「夏雪冬日」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明. 原文链接:https://blog.csdn.net/hyg0811/a ...
- 阿里 IOS 面试官教你在面试中脱颖而出
前言: 知己知彼.百战不殆,面试也是如此. 只有充分了解面试官的思路,才能更好地在面试中充分展现自己. 今天,阿里高级技术专家将分享自己作为面试官的心得与体会.如果你是面试者,可以借此为镜,对照发现自 ...
- 从面试官的角度,聊聊java面试流程
在这篇回答里,就讲以我常规的面试流程为例,说下java方面大致会问什么问题,以及如何确认候选人达到招聘要求. 先说面试前准备,可能有些面试官是拿到简历直接问,而且是在候选人自我介绍时再草草浏览简历,但 ...
- 面试官:请你说下N95应该怎么测试?这样回答让他竖起大拇指!
随着”新冠疫情“慢慢地消散,各大企业都开始恢复正常的运行. 因为疫情造成很多工作人员的流失,企业也开始疯狂的招聘新鲜的人才,这对于莘莘求职者无疑是个机会. 但是因为求职者众多,很多面试官也开始想方设法 ...
- 面试官问:HashMap在并发情况下为什么造成死循环?一脸懵
这个问题是在面试时常问的几个问题,一般在问这个问题之前会问Hashmap和HashTable的区别?面试者一般会回答:hashtable是线程安全的,hashmap是线程不安全的. 那么面试官就会紧接 ...
- 面试官:你说你精通源码,那你知道ArrayList 源码的设计思路吗?
Arraylist源码分析 ArrayList 我们几乎每天都会使用到,但是通常情况下我们只是知道如何去使用,至于其内部是怎么实现的我们不关心,但是有些时候面试官就喜欢问与ArrayList 的源码相 ...
- 搞定面试官 - 你可以介绍一下在 MySQL 中,哪些情况下 索引会失效嘛?
大家好,我是程序员啊粥,前边给大家分享了 *MySQL InnoDB 索引模型 在 MySQL InnoDB 中,为什么 delete 删除数据之后表数据文件大小没有变 如何计算一个索引的长度 如何查 ...
随机推荐
- js动态渲染链接outline为随机颜色
[].forEach.call($("*"),function(a){ a.style.outline="1px solid #"+(~~(Math.rando ...
- Nginx面试中最常见的18道题 抱佛脚必备
Nginx的并发能力在同类型网页服务器中的表现,相对而言是比较好的,因此受到了很多企业的青睐,我国使用Nginx网站的知名用户包括腾讯.淘宝.百度.京东.新浪.网易等等.Nginx是网页服务器运维人员 ...
- 【习题 4-4 UVA - 253】Cube painting
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 绕(x,y,z)三个轴旋转. 枚举x,y,z各4次的结果. (4次之后能还原.可以方便上一层枚举下一个情况.) [代码] #incl ...
- ASP.NET--MVC--伪静态
原文地址 以前伪静态很流行主要是为了SEO优化排名,现在搜索引擎对静态网站和动态网站的权重差不多了,就没有必要再伪静态了,个人意见,仅供参考. 有些客户要求设置静态的,为了完成需求,而且更简单的做法就 ...
- 洛谷——P1910 L国的战斗之间谍
https://www.luogu.org/problem/show?pid=1910#sub 题目背景 L国即将与I国发动战争!! 题目描述 俗话说的好:“知己知彼,百战不殆”.L国的指挥官想派出间 ...
- HDU-4451-Dressing (2012年金华赛区J题)
Dressing Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total S ...
- 高速学会Mac上托管代码到github(具体解释)
之前最開始的时候就一直在github浏览下载各种代码,然后弄了一下代码上传不知道咋弄就不了了之了.刚好近期有空余时间就研究了下github托管代码,这里就具体说说怎样高速的学会github上传你的代码 ...
- C语言读取文件大量数据到数组
针对.txt文档的大量有规律数据,譬如100行8列的数据将其读取到二维数组(矩阵)中,留作之后的数据处理. 改程序通过宏定义的方法来确定将要读取程序的行数和列数,将数据读取到二维数组data[100] ...
- URAL 1826. Minefield(数学 递归)
题目链接:http://acm.timus.ru/problem.aspx? space=1&num=1826 1826. Minefield Time limit: 0.5 second M ...
- SpringMVC文件上传和下载的实现
SpringMVC通过MultipartResolver(多部件解析器)对象实现对文件上传的支持. MultipartResolver是一个接口对象,需要通过它的实现类CommonsMultipart ...