今天遇到一个很奇怪的问题,mybatis的 # 和 $ 防注入的区别我知道,百度了一下只有说 order by 要使用 $ 这一层,却没有说使用 # 也不报错的问题。
情况是这样的:
order by 后面接动态参数,如果这个动态参数在 table 里不存在,按理来说这个sql执行是会报错的。
我直接在数据库运行sql正是报错的。
但是问题来了,用 #{不存在的字段} 他不会报错,还是会查询出结果,虽然结果没有排序。
但是用 ${不存在的字段} 就会报错。
有大神指点一下这是什么原因吗?
不报错的sql:
select * from table order by #{column};
会报错的sql:
select * from table order by ${column};
${变量名}不进行数据类型匹配,直接替换。
所以报错
#{变量名}可以进行预编译、类型匹配等操作,因此忽略了不存在的排序字段,最后sql没有问题
这个是使用方式的错误,#{column}参数会预编译为order by ?,设置值后会自动加上单引号,实际会变成order by 'fieldname',这样是不会报错的,而且无论放字段是否存在都达不到你想要的排序效果。
${column}是替换方式,执行时是order by filedname,不存在的字段名肯定会报错。
一般情况下面order by 都是用${column}
这不是mybatis的问题,在mysql中直接order by ''便可正常查询;