mybatis动态传参#{}和${}的区别
#{}是PreparedStatement 可以防止sql注入
${}是Statement
详细请看下面这个帖子,很全面
https://blog.csdn.net/siwuxie095/article/details/79190856
这里说一下什么是sql注入问题
原因:
sql注入是一种常见的web漏洞问题,当前后端数据交互的时候,由于前端校验不严格,后端拿到了前端传入过来的数据直接拼接进sql语句,导致查询结果出错,这里举个例子.
当你要根据用户id这个主键值去查询用户的时候,正常的sql语句是这样的,假如id为1
select * from user where userid = 1
传入的值放前端传过来的数据,但是如果在前端输入 1 or 1=1
这样前端传过来之后后台拼接变成了
select * from user where userid = 1 or 1=1
这样就查询出来了所有的用户,造成了用户信息泄露的风险,这样的例子还有很多,这里就不一一举例.上述${}正是将参数拼接成sql语句
为什么#{}可以防止sql注入:
因为使用#{},相当于先将sql预编译,比如上述sql语句,首先进行预编译
select * from user where userid = ?
用问号将参数位置替代,这样整个语句的框架就搭好了,再将?替换成你传入的参数,如果传入参数依旧是1 or 1 = 1,这种方式不会将 or 1 = 1识别为一种条件,而是将
1 or 1 = 1整体识别为一种参数,当然查询结果也为0.