原因:在业务开发中,#{orderBy}里一般传入的是字符串变量,因此会被预编译为带问号的语句以及参数,...order by ?..., Parameters:‘time’(String) ,并在执行时被正式编译为带引号的语法,例如order by ‘time’,这就和mysql的order by time语法不一致,因此是不生效的(但不会报错)
解决方法1:改为${orderBy},不过会引起sql注入问题,可以加个<script></script>据说能解决sql注入
解决方法2:
<choose>
<when test="orderBy == 'column1'">
ORDER BY column1
</when>
<when test="orderBy == 'column2'">
ORDER BY column2
</when>
<!-- 可以添加更多的条件 -->
<otherwise>
<!-- 默认排序方式 -->
ORDER BY default_column
</otherwise>
</choose>
该问题(在mybatis中对order by预编译传参不生效)并不是mybatis的问题,我认为是sql语法的问题 ,谁让sql语法里order by 后面跟的是一个不带引号的字段名呢。当然mybatis也可以在解析时判断是否是order by 关键字后面跟的#{},是就把传入参数的引号去掉,但是这样很鸡肋。。也不规范。所以mybatis干脆不管了