Mybatis之占位符與拼接符


1.占位符

    1.1  含義:

        在持久化框架中,為了將約束條件中的可變參數從sql中分離出來,在原有的參數位置使用特殊的標記來標記該位置,后期通過代碼給sql傳遞參數(即實現sql與代碼分離開)。這個特殊的標記被稱為占位符。

    1.2 優點:

        1.2.1 防止sql注入,提高了安全性

        1.2.2 對於只有參數不同的sql語句,只需要編譯一次{以后會從緩存中獲取}

    1.3 形式:

         占位符在持久化框架中的一般形式為:?。Mybatis為了更加方便的與參數列表進行映射,采用的形式為:#{參數名}

    1.4 示例:

SELECT * FROM t_address t where t.id = #{id}
--等價於
SELECT * FROM t_address t where t.id =

    1.5 注意:

        占位符只能在約束條件中使用

--持久化框架中,不允許以下形式:
SELECT * FROM ?  
SELECT * FROM t_address order by ?  

--mybatis中,不允許以下形式                             
SELECT * FROM #{tableName}
SELECT * FROM t_address order by  #{orderBy}

 

2. 拼接符

    2.1 背景:

        由於占位符只能在sql語句的約束條件中使用,有時候sql語句需要其它的一些變量參數(非約束條件中)來控制,如:表名、排列順序等。所以Mybatis使用了拼接符的概念

    2.2 形式:${參數名}

    2.3 示例:

SELECT * FROM ${tableName}

    2.4 注意:

        如果參數通過用戶獲取,則不能使用拼接符的形式【會發生sql注入,不安全】

 

3. 補充:

    在進行預編譯的時候,會用參數值直接替換${參數名},用?替換#{參數名}

 

4. sql注入

    4.1 概念:

        將sql語法里的一些組合,通過表單提交或頁面請求注入到sql語句中,欺騙服務器執行惡意sql語句

    4.2 示例:

String id =1 or 1 = 1”;
String sql =select * from t_address where id =+id;

    4.2 防止sql注入的方法:

        對於表單提交的數據,使用占位符的形式構建sql語句(占位符不識別參數的sql語法【作為普通字符串】)

String id = “1 or 1 = 1”
String sql = “select * from t_address where id = ?”

//解析后:

select * from t_address where id = ‘1 or 1 = 1’;

 


免責聲明!

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



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