前端向后端传入参数实现字段排序,参数信息正常,但是后台数据库查询返回的结果未排序

问题

前端向后端传参数,后端用自己封装的实体类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

总结

  1. 使用order by 动态参数进行排序时,要用${}。(${}一般用于传入数据库对象,比如表字段名、表名等)
  2. #{}可防止sql注入,能用#{}就别用${}
发布了18 篇原创文章 · 获赞 9 · 访问量 2919

猜你喜欢

转载自blog.csdn.net/weixin_43575868/article/details/103502783
今日推荐