更新時間:2023年05月10日09時49分 來源:傳智教育 瀏覽次數(shù):
在MyBatis中,#{}和${}都是用于參數(shù)替換的占位符,但它們的行為有所不同。
#{}會將參數(shù)作為預(yù)編譯的參數(shù)進(jìn)行處理,可以防止SQL注入攻擊,并且能夠自動將傳入的參數(shù)進(jìn)行類型轉(zhuǎn)換。在SQL執(zhí)行前,#{}中的占位符會被替換成問號,然后將參數(shù)值設(shè)置到PreparedStatement中。
${}則會將參數(shù)直接拼接到SQL語句中,因此容易受到SQL注入攻擊,并且不能自動進(jìn)行類型轉(zhuǎn)換。在SQL執(zhí)行前,${}中的占位符會被替換成實際的參數(shù)值。
下面是一個簡單的代碼示例:
<!-- 使用#{} --> <select id="getUserById" resultType="User"> SELECT * FROM user WHERE id = #{userId} </select> <!-- 使用${} --> <select id="getUserByName" resultType="User"> SELECT * FROM user WHERE name = '${userName}' </select>
在使用#{}的情況下,userId的值會被作為預(yù)編譯的參數(shù)進(jìn)行處理,可以防止SQL注入攻擊,并且能夠自動進(jìn)行類型轉(zhuǎn)換。而在使用${}的情況下,userName的值會被直接拼接到SQL語句中,容易受到SQL注入攻擊,并且不能自動進(jìn)行類型轉(zhuǎn)換。因此,推薦使用#{}來替換參數(shù)。