今天在公司写代码的时候,想到有这样的需求,就是点击不同的按钮,跳转到同一个页面,但根据不同的条件对查询出来的结果进行排序。因为有六七种情况,所以我不可能相同的代码重复写六七遍,仅仅是查询条件不同。
所以自然而然的就想到传入一个参数给sql语句,然后使用order by进行排序。
因为之前一直使用#运算符,所以一如既往,使用#运算符就干,然鹅结果却是不起作用,看了一下输出日志,发现是这样输出的
select * from tableName order by ?;
parameter:columnName(String)
看看没啥毛病啊,实在不理解,就去查阅资料,发现和$、#运算符有关。
(1)使用#运算符,Mybatis会将传入的对象当成一个字符串,在进行变量替换时会加上引号,所以上面的order by语句,替换后就变成了下面的样子
select * from tableName order by 'columnName';
虽然不会报错,但也不能正确排序
(2)使用$运算符,Mybatis不会进行预编译,直接把值传进去,无法防止sql注入,当我们需要传字段的名称时,可以考虑使用$符号,但在后台需要进行数据校验,才能在一定程度上防止sql注入。
sql注入
比如一个登陆的sql语句如下
select * from user where user_id = 'CodeTiger' and password = '123456';
当我们输入CodeTiger 123456的时候,自然能登陆成功。
然鹅当我们输入CodeTiger’;–,不论输入什么密码,都能够正确登陆,因为此时sql语句变成了下面的样子
select * from user where user_id = 'CodeTiger';--' and password = '123456';
后面的密码校验部分被注释了。这就是一个sql注入的小例子,当然实际中远远不止这么low,只是为了说明sql注入是什么。