最近在做一个查询表格内容的需求,用户可以点击表头字段切换排序规则。做完了发现排序没达到效果,随意传的参数居然也不报错。
orderSql是我拼好的,比如是assess desc。
搜索后发现是变量定义转义问题:
(1)对于形如#{orderSql}的变量,Mybatis会将其视为字符串值,在变量替换成功后,缺省地给变量值加上引号。例如:
order by #{orderSql}
假设orderSql传入值为assess desc,则最终SQL语句等同为:
ORDER BY ‘assess desc’
而这个结果在日志里是发现不了的,该句子语法检查亦能通过,可以执行。
(2)对于形如${orderSql}的变量,Mybatis会将其视作直接变量,即在变量替换成功后,不会再给其加上引号。例如:
order by ${orderSql}
假设orderSql传入值为assess desc,则最终SQL语句等同为:
ORDER BY assess desc
为想要的正确结果。
======================================================
另,在写代码过程中才恍然领悟,标签不一定非要在标签内使用,如果套上标签,反而会在如下图的and前默认加上where。
此外,if标签里判断isTotal为true的写法是:
<if test="isTotal != null and isTotal == true">
注意不要把==写成=。