点关注,不迷路;持续更新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?请回答下这几个问题的更多相关文章

  1. 8年经验面试官详解 Java 面试秘诀

      作者 | 胡书敏 责编 | 刘静 出品 | CSDN(ID:CSDNnews) 本人目前在一家知名外企担任架构师,而且最近八年来,在多家外企和互联网公司担任Java技术面试官,前后累计面试了有两三 ...

  2. Android开发面试经——6.常见面试官提问Android题②(更新中...)

    版权声明:本文为寻梦-finddreams原创文章,请关注:http://blog.csdn.net/finddreams 关注finddreams博客:http://blog.csdn.net/fi ...

  3. Java面试官最爱问的volatile关键字

    在Java的面试当中,面试官最爱问的就是volatile关键字相关的问题.经过多次面试之后,你是否思考过,为什么他们那么爱问volatile关键字相关的问题?而对于你,如果作为面试官,是否也会考虑采用 ...

  4. <转载>面试官,不要再问我三次握手和四次挥手

    版权声明:本文为CSDN博主「夏雪冬日」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明. 原文链接:https://blog.csdn.net/hyg0811/a ...

  5. 阿里 IOS 面试官教你在面试中脱颖而出

    前言: 知己知彼.百战不殆,面试也是如此. 只有充分了解面试官的思路,才能更好地在面试中充分展现自己. 今天,阿里高级技术专家将分享自己作为面试官的心得与体会.如果你是面试者,可以借此为镜,对照发现自 ...

  6. 从面试官的角度,聊聊java面试流程

    在这篇回答里,就讲以我常规的面试流程为例,说下java方面大致会问什么问题,以及如何确认候选人达到招聘要求. 先说面试前准备,可能有些面试官是拿到简历直接问,而且是在候选人自我介绍时再草草浏览简历,但 ...

  7. 面试官:请你说下N95应该怎么测试?这样回答让他竖起大拇指!

    随着”新冠疫情“慢慢地消散,各大企业都开始恢复正常的运行. 因为疫情造成很多工作人员的流失,企业也开始疯狂的招聘新鲜的人才,这对于莘莘求职者无疑是个机会. 但是因为求职者众多,很多面试官也开始想方设法 ...

  8. 面试官问:HashMap在并发情况下为什么造成死循环?一脸懵

    这个问题是在面试时常问的几个问题,一般在问这个问题之前会问Hashmap和HashTable的区别?面试者一般会回答:hashtable是线程安全的,hashmap是线程不安全的. 那么面试官就会紧接 ...

  9. 面试官:你说你精通源码,那你知道ArrayList 源码的设计思路吗?

    Arraylist源码分析 ArrayList 我们几乎每天都会使用到,但是通常情况下我们只是知道如何去使用,至于其内部是怎么实现的我们不关心,但是有些时候面试官就喜欢问与ArrayList 的源码相 ...

  10. 搞定面试官 - 你可以介绍一下在 MySQL 中,哪些情况下 索引会失效嘛?

    大家好,我是程序员啊粥,前边给大家分享了 *MySQL InnoDB 索引模型 在 MySQL InnoDB 中,为什么 delete 删除数据之后表数据文件大小没有变 如何计算一个索引的长度 如何查 ...

随机推荐

  1. CentOS安装新版RabbitMQ解决Erlang 19.3版本依赖

    通过yum等软件仓库都可以直接安装RabbitMQ,但版本一般都较为保守. RabbitMQ官网提供了新版的rpm包(http://www.rabbitmq.com/download.html),但是 ...

  2. SOA架构设计的案例分析

    面向服务的架构(SOA)是一个组件模型,它将应用程序的不同功能单元(称为服务)进行拆分,并通过这些服务之间定义良好的接口和契约联系起来.接口是采用中立的方式进行定义的,它应该独立于实现服务的硬件平台. ...

  3. webpack 配置 Vue 多页应用 —— 从入门到放弃

    webpack 配置 Vue 多页应用 -- 从入门到放弃 一直以来,前端享有无需配置,一个浏览器足矣的优势,直到一大堆构建工具的出现,其中 webpack 就是其中最复杂的一个,因此出现了一个新兴职 ...

  4. HTML <area> 对象

    <area>对象的属性 属性 描述 W3C alt 设置或返回当浏览器无法显示某个区域时的替换文字. Yes coords 设置或返回图像映射中可点击区域的坐标. Yes hash 设置或 ...

  5. java中Date与String转化 string转float

    这种转换要用到java.text.SimpleDateFormat类 字符串转换成日期类型: 方法1: Date date=new Date("2017-02-01"); 方法2: ...

  6. SecureCRT 会话丢失的处理办法

    SecureCRT 会话丢失的处理办法 在SecureCRT中已经有了70多个session,密码都记忆了,当然有些失效的也没有删除: 某一天,打开SecureCRT之后,发现session都没有了, ...

  7. RubyMine生成reader/writer方法

    RubyMine生成reader/writer方法 在非类的ruby文件中,Alt+Insert会出现新建文件的选项: 在ruby文件的类中,Alt+Insert会出现get/set方法生成提示和重构 ...

  8. 高速学会Mac上托管代码到github(具体解释)

    之前最開始的时候就一直在github浏览下载各种代码,然后弄了一下代码上传不知道咋弄就不了了之了.刚好近期有空余时间就研究了下github托管代码,这里就具体说说怎样高速的学会github上传你的代码 ...

  9. @RequestParam,@PathVariable等注解区别

    一.@RequestParam和@PathVariable的区别 1.@RequestParam是从uri中request后面的参数串来取得参数的 2.@PathVariable是从uri模板中取得参 ...

  10. POJ 1166 The Clocks (暴搜)

    发现对这样的模拟题根本没啥思路了,本来准备用bfs的.可是结果超时了,这是參考别的人代码写的: #include <stdio.h> #include <iostream> # ...