Mybatis之占位符与拼接符
1.占位符
? ? 1.1? 含義:
? ? ? ? 在持久化框架中,為了將約束條件中的可變參數(shù)從sql中分離出來,在原有的參數(shù)位置使用特殊的標(biāo)記來標(biāo)記該位置,后期通過代碼給sql傳遞參數(shù)(即實(shí)現(xiàn)sql與代碼分離開)。這個(gè)特殊的標(biāo)記被稱為占位符。
? ? 1.2 優(yōu)點(diǎn):
? ? ? ? 1.2.1 防止sql注入,提高了安全性
? ? ? ? 1.2.2 對(duì)于只有參數(shù)不同的sql語(yǔ)句,只需要編譯一次{以后會(huì)從緩存中獲取}
? ? 1.3 形式:
? ? ? ?? 占位符在持久化框架中的一般形式為:?。Mybatis為了更加方便的與參數(shù)列表進(jìn)行映射,采用的形式為:#{參數(shù)名}
? ? 1.4 示例:
SELECT * FROM t_address t where t.id = #{id} --等價(jià)于 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語(yǔ)句的約束條件中使用,有時(shí)候sql語(yǔ)句需要其它的一些變量參數(shù)(非約束條件中)來控制,如:表名、排列順序等。所以Mybatis使用了拼接符的概念
? ? 2.2 形式:${參數(shù)名}
? ? 2.3 示例:
SELECT * FROM ${tableName}? ? 2.4 注意:
? ? ? ? 如果參數(shù)通過用戶獲取,則不能使用拼接符的形式【會(huì)發(fā)生sql注入,不安全】
?
3. 補(bǔ)充:
? ? 在進(jìn)行預(yù)編譯的時(shí)候,會(huì)用參數(shù)值直接替換${參數(shù)名},用?替換#{參數(shù)名}
?
4. sql注入
? ? 4.1 概念:
? ? ? ??將sql語(yǔ)法里的一些組合,通過表單提交或頁(yè)面請(qǐng)求注入到sql語(yǔ)句中,欺騙服務(wù)器執(zhí)行惡意sql語(yǔ)句
? ? 4.2 示例:
String id = “1 or 1 = 1”; String sql = “select * from t_address where id = ”+id;? ? 4.2 防止sql注入的方法:
? ? ? ??對(duì)于表單提交的數(shù)據(jù),使用占位符的形式構(gòu)建sql語(yǔ)句(占位符不識(shí)別參數(shù)的sql語(yǔ)法【作為普通字符串】)
String id = “1 or 1 = 1” String sql = “select * from t_address where id = ?”//解析后: select * from t_address where id = ‘1 or 1 = 1’;?
轉(zhuǎn)載于:https://www.cnblogs.com/BlueStarWei/p/9385320.html
總結(jié)
以上是生活随笔為你收集整理的Mybatis之占位符与拼接符的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql学习-join的使用
- 下一篇: 数字转换为英文大写