问题
前端向后端传参数,后端用自己封装的实体类Page来接收,目的是为了实现根据前端传入的字段sort和order进行正序或倒序排序
,log日志显示传入的参数信息正常,但是查询返回的结果并没有进行排序,查询的sql语句如下:
<select id="getAllUsers" resultMap="BaseResultMap" parameterType="com.hrms.utils.Page">
select *
from tb_staff
order by #{sort} #{order}
limit #{offset},#{limit}
</select>
解决方式
将#
改成$
,即${sort} ${order}
,正确的sql语句为:
<select id="getAllUsers" resultMap="BaseResultMap" parameterType="com.hrms.utils.Page">
select *
from tb_staff
order by ${sort} ${order}
limit #{offset},#{limit}
</select>
原因
#{}
:占位符,防止sql注入,但是替换结果会加上单引号。
${}
:拼接符,无法防止sql注入,但是替换结果不会加单引号
很明显,无法正确排序就是因为#{sort}
和#{order}
替换结果被加上单引号,sql语句变成select * from tb_staff order by 'truename' 'asc' limit 0,5
总结
- 使用
order by 动态参数
进行排序时,要用${}
。(${}
一般用于传入数据库对象,比如表字段名、表名等) #{}
可防止sql注入,能用#{}
就别用${}