#{} 表示一個占位符號,通過 #{} 可以實現 preparedStatement 向占位符中設置值,自動進行 java 類型和 jdbc 類型轉換。#{} 可以有效防止 sql注入。 #{} 可以接收簡單類型值或 pojo 屬性值。 如果 parameterType 傳輸單個簡單類型值,#{} 括號中可以是 value 或其它名稱。
${} 表示拼接sql串,通過 ${} 可以將 parameterType 傳入的內容拼接在 sql 中且不進行 jdbc 類型轉換,不能防止 sql 注入問題, ${} 可以接收簡單類型值或 pojo 屬性值,如果 parameterType 傳輸單個簡單類型值,${} 括號中只能是 value。
下面舉個例子來說明這兩個的區別:
代碼上來先:
<!-- 通過ID查詢一個用戶 --> <select id="findUserById" parameterType="Integer" resultType="com.msym.beans.User"> select * from user where id = #{v} </select> <!-- //根據用戶名稱模糊查詢用戶列表 #{} select * from user where id = ? 占位符 ? == '五' ${} select * from user where username like '%五%' 字符串拼接 --> <select id="findUserByUsername1" parameterType="String" resultType="com.msym.beans.User"> select * from user where username like '%${value}%' </select> <select id="findUserByUsername2" parameterType="String" resultType="com.msym.beans.User"> select * from user where username like "%"#{v}"%" </select>
上面是 user 類對應的 user.xml 文件,用於編寫 sql 語句,避免了硬編碼。
id 為 findUserByUsername1 的采用的是 ${} 占位符,id 為findUserByUsername2 采用的是 #{} 占位符,
前者生成的 sql 為 select * from user where username like ‘%XXX%’;
后者生成的 sql 語句是 select * from user where username like "%"'XXX'"%",(這樣的格式我還沒在 sql 中寫過,但是的確能 run)
(XXX 是調用該查詢是傳入的參數)注意這兩者的不同,前者不能防止 sql 注入,后者能防止。