${} 和 #{}的問題
<select id="selectPostOrder" resultMap="postOrderResultMap">
SELECT id, cid, lid, univalent, (account-nowaccount) as naccount, pclass, finaltime
FROM postorder
WHERE cid = #{id} and (account-nowaccount) > 0 and id not in (
select pid from optest
) and #{select} = '${input}'
</select>
#{}占位符:使用#{}占位符來表示動態傳入的參數,例如#{id}和#{select}。在執行 SQL 語句之前,MyBatis 會將#{}占位符替換成相應的參數值,并進行參數類型轉換和 SQL 注入防范。${}表達式:使用${}表達式來表示字符串拼接和替換。在執行 SQL 語句之前,MyBatis 會將${}表達式替換成相應的字符串,并將其嵌入到 SQL 語句中。需要注意,在使用${}表達式時,傳入的參數值不會進行參數類型轉換和 SQL 注入防范,因此需要特別小心避免 SQL 注入攻擊。
例如,假設調用該查詢語句時傳入的參數為 id=1、select='name' 和 input='北京',則執行的 SQL 語句為:
SELECT id, cid, lid, univalent, (account-nowaccount) as naccount, pclass, finaltime FROM postorder WHERE cid = 1 and (account-nowaccount) > 0 and id not in ( select pid from optest ) and 'name' = '北京'
其中,將 #{id} 和 #{select} 占位符替換成相應的參數值,并將 ${input} 表達式替換成字符串 '北京',并將其嵌入到 SQL 語句中。
需要注意的是,使用 ${} 表達式時,可能存在 SQL 注入攻擊的風險,因此應該避免在 SQL 語句中嵌入動態生成的參數值,或者使用 MyBatis 提供的轉義工具來對參數值進行轉義,以提高應用安全性。

浙公網安備 33010602011771號