Mybatis中 # 和 $的区别
在Mybatis中。我们使用mapper引用变量时,都是默认使用#号,但是也可以使用$,那他们有什么区别呢?
我们需要先了解一下
sql语句的预编译和拼接的区别
String sql = "select * from user where id = " + id;
这里就是属于sql语句的拼接了,
什么叫做拼接呢?
就是我们输入的会自动拼接在后面
假设我们可以输入这样一句 id or 1 = 1
那么数据库会理解成以下这样:
select * from user where id = id or 1 = 1;
执行的时候,虽然 在数据库中找不到一个id 是id 的人,但是 1 =1 是恒成立的,所以数据库里的数据还是会被查询到,
但是如果我们用的是预编译方式
String sql = “select * from user where id = ?”
这里的问号相当于一个占位符,就像是一个参数,我们需要输入一个参数。
如果我们也输入 id or 1 =1
那么在预编译的情况下,会把这个当做一个整体,会去数据库中查询时候有一个id为 id or 1 = 1的人,显然是没有的,所以不会暴露出数据库中的数据。这也是就防sql注入攻击的原理。
显然 # 和 $ 也是一样的原理
#{}也相当与一个占位符,采用的是预编译的处理方式,
而${}采用的是字符串拼接的方式,这是一种不安全的行为,
所以我们在一般情况下都是用占位符方式,也就是#{}