mybatis #、$的区别、缓存、

mybatis作为ORM框架,从性能,系统维护性,实用性上来说,都是非常优秀的,
其所有的sql在执行前都会通过数据库驱动进行预编译,这样DBMS就可以不用编译直接接收参数运行,
而#和$号的区别在预编译后就能看出来了,#{}预编译完是占位符?,而${}预编译完就是传进来的参数。

l #{}${}

#{}表示占位符?#{}接收简单类型的参数时里面的名称可以任意

${}表示拼接符,${}接收简单类型的参数时里面的名称必须value

${}里面的值会原样输出,不加解析(如果该参数值是字符串,有不会添加引号)

${}存在sql注入的风险,但是有些场景下必须使用,比如排序后面会动态传入排序的列名


一般如果可以使用#就不要使用$符号。
1)使用#入参,myBatis会生成PrepareStatement并且可以安全地设置参数(=?)的值。因为sql语句已经预编译好了,传入参数的时候,不会重新生产sql语句。安全性高。
2)用$可以会有sql注入的问题:
例如,select * from emp where ename = '用户名',如果使用$入参,用户名被传入例如‘smith or 1 = 1’,那无论ename是否匹配都能查到结果。
3)在特定场景下,例如如果在使用诸如order by '{param}',这时候就可以使用$.


======================================================

MyBatis 的缓存分为一级缓存二级缓存

  • 一级缓存是 SqlSession 级别的缓存
  • 二级缓存是 mapper 级别的缓存,多个 SqlSession 共享

这里写图片描述

一级缓存

一级缓存是 SqlSession 级别的缓存,是基于 HashMap 的本地缓存。不同的 SqlSession 之间的缓存数据区域互不影响。

一级缓存的作用域是 SqlSession 范围,当同一个 SqlSession 执行两次相同的 sql 语句时,第一次执行完后会将数据库中查询的数据写到缓存,第二次查询时直接从缓存获取不用去数据库查询。当 SqlSession 执行 insert、update、delete 操做并提交到数据库时,会清空缓存,保证缓存中的信息是最新的。

sqlsession中有一个数据区域map结构这个区域就是一级缓存区域一级缓存中的key是由sql语句条件、statement等信息组成一个唯一值一级缓存中的value,就是查询出的结果对象

MyBatis 默认开启一级缓存。

二级缓存是 mapper 级别的缓存,同样是基于 HashMap 进行存储,多个 SqlSession 可以共用二级缓存,其作用域是 mapper 的同一个 namespace。不同的 SqlSession 两次执行相同的 namespace 下的 sql 语句,会执行相同的 sql,第二次查询只会查询第一次查询时读取数据库后写到缓存的数据,不会再去数据库查询。

MyBatis 默认没有开启二级缓存,开启只需在配置文件中写入如下代码:

<settings>  
      <setting name="cacheEnabled" value="true"/>  
</settings>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值