点关注,不迷路;持续更新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 的问题你都清楚了吗。

转载于:https://www.cnblogs.com/Java-no-1/p/11025686.html

面试官:精通 Mybatis?请回答下这几个问题相关推荐

  1. 面试官让我讲下线程的WAITING状态,我笑了

    转载自  面试官让我讲下线程的WAITING状态,我笑了 面试官Q:你讲下线程状态中的WAITING状态,什么时候会处于这个状态?什么时候离开这个状态? 小菜J 会心一笑... 一个正在无限期等待另一 ...

  2. 面试官让我讲下线程的TIMED_WAITING状态,我又笑了

    转载自  面试官让我讲下线程的TIMED_WAITING状态,我又笑了 面试官Q:你讲下线程状态中的WAITING状态,什么时候会处于这个状态?什么时候离开这个状态? 小菜J 会心一笑,可以撮这里 - ...

  3. swf缓存文件在哪里_面试官:mybatis一级缓存二级缓存的区别都不知道,知道门在哪吧...

    面试官:虫虫你简历上写了了解mybatis缓存,那你能说说一级缓存和二级缓存的区别吗? 虫虫:我只知道这是用来缓存sql查询的数据 面试官:没了? 虫虫:没了 面试官:公司门知道在哪里吧 自己走还是我 ...

  4. 【267期】面试官:Mybatis 如何实现流式读取 MySQL 大数据量记录?

    点击上方"Java精选",选择"设为星标" 别问别人为什么,多问自己凭什么! 下方有惊喜,留言必回,有问必答! 每一天进步一点点,是成功的开始... 背景 最近 ...

  5. 在面试官面前优雅地种下红黑树

    前言 希望面对面试官的各种红黑树的灵魂拷问时,也能像标题一般,优雅地娓娓道来. 目录 一.红黑树的基本性质 二.为什么要用红黑二叉树 1. 二叉搜索树(Binary Search Trees) 2.二 ...

  6. 面试官:能说下 SpringBoot 启动原理吗?

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:硬刚一周,3W字总结,一年的经验告诉你如何准备校招! 个人原创100W+访问量博客:点击前往,查看更多 Spri ...

  7. java执行sql文件_面试官:MyBatis SQL是如何执行的?把这篇文章甩给他

    初识 MyBatis MyBatis 是第一个支持自定义 SQL.存储过程和高级映射的类持久框架.MyBatis 消除了大部分 JDBC 的样板代码.手动设置参数以及检索结果.MyBatis 能够支持 ...

  8. mybatis的简单查询用语句吗_面试官:Mybatis中的TypeHandler你用过吗?

    前言 相信大家用Mybatis这个框架至少一年以上了吧,有没有思考过这样一个问题:数据库有自己的数据类型,Java有自己的数据类型,那么Mybatis是如何把数据库中的类型和Java的数据类型对应的呢 ...

  9. sqlserver检测到基于一致性的逻辑_面试官;解决分布式场景下数据一致性问题

    在这一篇中主要回答目前分布式事务问题是怎么解决的?行业中有什么解决方案?这些解决方案分别有什么优缺点?别人是怎么做的?我们可以怎么来做? 支付重构 考虑支付重构的时候,自然想到原本属于一个本地事务中的 ...

  10. plsql怎么查看存储过程中long变量的值_面试官:详细说下基本数据类型与装箱拆箱的过程...

    基本数据类型,有存放在栈中的,也有存放堆中的,这取决去基本类型声明的位置. 一:在方法中声明的变量,即该变量是局部变量,每当程序调用方法时,系统都会为该方法建立一个方法栈,其所在方法中声明的变量就放在 ...

最新文章

  1. 2021年大数据Flink(十六):流批一体API Connectors ​​​​​​​​​​​​​​Redis
  2. Alibaba Dubbo框架同步调用原理分析-2
  3. poj 2288(状态压缩dp + TSP问题)
  4. 开发:异常收集之 ibatis+Oracle 查询时: ORA-00911错误
  5. python 离线翻译软件_AI赋能翻译,讯飞这个设备轻松搞定国际交流
  6. qrp文件如何用excel打开_问与答66: 如何不打开Excel文件删除行?
  7. linux c 指针和内存分配内存,linux-C基础系列-内存管理(野指针).md
  8. 低代码开发平台_什么是低代码和无代码开发平台?
  9. form提交php怎么接收不到,php form表单post提交获取不到数据,而使用get提交能获取到数据 的解决办法...
  10. Bailian4085 数组去重排序【桶排序】
  11. word怎么把页面顺序倒过来_Word打印错乱——出现两个第1页
  12. password php,password.php
  13. 计算机那种专业包括vr,VR技术的大学专业有哪些
  14. windows 驱动开发使用的一些工具
  15. MATLAB中figure函数
  16. 用二分法求下面方程在(-10,10)的根:2x3-4x2+3x-6=0
  17. Flutter pageview indicator指示器实现
  18. 网络爬虫-神器fiddler抓取app数据
  19. 华硕电脑重装系统后fn组合键部分屏幕无显示
  20. ixigua解析_西瓜视频地址解析

热门文章

  1. HashMap.values().addAll()异常
  2. TeeChart for .NET常用属性总结
  3. 实战篇-简单多语言的实现
  4. python读取压缩包中csv文件
  5. element,点击查看,实现tab切换:
  6. 数据库锁解决并发问题
  7. 数据仓库系列1-高质量数据建模
  8. CSS 会被继承的属性
  9. NS2源码图示---数据链路层 (转帖)
  10. 转帖:从C51的指针到病毒-c51软复位,经典,分析透彻