問題
前端向後端傳參數,後端用自己封裝的實體類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注入,能用#{}
就別用${}