Mybatis 中 sql 語句的占位符 #{} 和 ${}


       #{} 表示一個占位符號,通過 #{} 可以實現 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 注入,后者能防止。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM