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注入是什么。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值