Loading

Mybatis使用order by语句

今天在公司写代码的时候,想到有这样的需求,就是点击不同的按钮,跳转到同一个页面,但根据不同的条件对查询出来的结果进行排序。因为有六七种情况,所以我不可能相同的代码重复写六七遍,仅仅是查询条件不同。

所以自然而然的就想到传入一个参数给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注入是什么。

posted @ 2018-08-11 05:46  CodeTiger  阅读(339)  评论(0编辑  收藏  举报