zoukankan      html  css  js  c++  java
  • mybatis

    一、最常见,参数中 #{} 和 ${} 有什么区别?

    1、要点:

    • #{}是编译处理,可以防止 SQL 注入攻击。
    • ${}是静态文本替换,有 SQL 注入攻击风险。

    2、详情:

    • #{}会将sql语句编译好并使用占位符?,然后再进行取值(值转换成字符串)很大的程度防止sql注入。${}先取值(不做任何处理直接引用)然后再去编译sql语句,无法防止sql注入,一般用于传入数据库对象,比如表名之类的。
    • #{}是sql的参数占位符,Mybatis会将sql中的#{}替换为 ?号,会编译处理。在sql执行前会使用PreparedStatement的参数设置方法,按序给sql的 ?号占位符设置参数值。{}是Properties文件中的变量占位符,它可以用于标签属性值和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 的问题你都清楚了吗。

  • 相关阅读:
    如何将一个PDF文件里的图片批量导出
    (二十二)golang--时间和日期相关函数
    (二十一)golang--字符串中的函数
    (二十)golang--变量的作用域
    (十九)golang--函数参数的传递方式
    (十八)golang--defer关键字
    (十七)golang--闭包(简单明了)
    (十六)golang--匿名函数
    (十五)golang--init函数
    【自然语言处理】双语数据预处理
  • 原文地址:https://www.cnblogs.com/qiu18359243869/p/11026457.html
Copyright © 2011-2022 走看看