1.佔位符sql
1.1 含義: 緩存
在持久化框架中,爲了將約束條件中的可變參數從sql中分離出來,在原有的參數位置使用特殊的標記來標記該位置,後期經過代碼給sql傳遞參數(即實現sql與代碼分離開)。這個特殊的標記被稱爲佔位符。安全
1.2 優勢:服務器
1.2.1 防止sql注入,提升了安全性mybatis
1.2.2 對於只有參數不一樣的sql語句,只須要編譯一次{之後會從緩存中獲取} 框架
1.3 形式:spa
佔位符在持久化框架中的通常形式爲:?。Mybatis爲了更加方便的與參數列表進行映射,採用的形式爲:#{參數名}code
1.4 示例:blog
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’;