(#{}和${}的区别)前端向后端传入参数实现字段排序,参数信息正常,但是后台数据库查询返回的结果未排序

问题

前端向后端传参数,后端用自己封装的实体类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注入,能用#{}就别用${}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值