博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MyBatis中$和#的区别
阅读量:6089 次
发布时间:2019-06-20

本文共 997 字,大约阅读时间需要 3 分钟。

动态 SQL 是 mybatis 的强大特性之一,也是它优于其他 ORM 框架的一个重要原因。mybatis 在对 sql 语句进行预编译之前,会对 sql 进行动态解析,解析为一个 BoundSql 对象,也是在此处对动态 SQL 进行处理的。在动态 SQL 解析阶段, #{ } 和 ${ } 会有不同的表现

1.都可以获取对象中的属性值,$[name] 和#[name]相同
2.#可以防止sql注入.先把sql中使用#的地方变成?占位 再设置参数值,

SELECT * FROM user WHERE name = #{name} AND password  = #{password}

#{} 在动态解析的时候, 会解析成一个参数标记符。就是解析之后的语句是:

SELECT * FROM user WHERE name = ?  AND password  = ?

那么我们使用 ${}的时候

select * from user where name = ${name};

${}在动态解析的时候,会将我们传入的参数当做String字符串填充到我们的语句中,就会变成下面的语句

select * from user where name = "xxx";

预编译之前的 SQL 语句已经不包含变量了,完全已经是常量数据了。相当于我们普通没有变量的sql了。
$会导致sql注入,可以拼接sql

SELECT * FROM user WHERE name = $[name] AND password  = $[password]

假如 name = OR 1 = 1 OR;

最终上面的sql会变成——>

SELECT * FROM user WHERE name = OR 1 = 1 OR  AND password  =

3.#会把传入的参数使用引号包起来

参数值?: 'name’

SELECT * FROM user WHERE name = ? AND password  = ?

总结:一般的使用#获取数据即可,在分组和排列操作值使用$,如果连接一个参数值使用$,拼接一段sql使用$.

#方式能够很大程度防止sql注入。
$方式无法防止Sql注入。
$方式一般用于传入数据库对象,例如传入表名.
一般能用#的就别用$.
在使用mybatis的时候,尽量的使用#方式

转载地址:http://zrvwa.baihongyu.com/

你可能感兴趣的文章
喷水装置问题(一)
查看>>
理解镜像和容器,并运行whalesay镜像
查看>>
bzoj3504: [Cqoi2014]危桥
查看>>
淘宝购物车计算总价格
查看>>
面试之并发的解决方案
查看>>
springcloud之config 配置管理中心之配置属性加密解密
查看>>
mysql 单表,多表,符合条件,子查询
查看>>
web的越权访问的处理(步骤详解)
查看>>
2011,向前冲
查看>>
js拼接字符串后swiper不能动的解决方案
查看>>
微信支付接口开发(前言)
查看>>
Android 解析XML文件和生成XML文件
查看>>
windows 7下删除右键新建菜单项的多余选项
查看>>
知问前端——Ajax登录
查看>>
C++安装失败解决办法
查看>>
Object.defineProperty
查看>>
记录一下我在lubuntu里面用到的工具
查看>>
首元素无边线
查看>>
Js处理本地视频和第三方视频播放的问题
查看>>
网页制作中规范使用DIV+CSS命名规则(转)
查看>>