含義
#{}: 爲佔位符
${}: 爲拼接符
MyBatis 中 #{} 和 ${} 的主要區別
- # 傳入的參數在 SQL 中顯示爲字符串,# 方式能夠很大程度防止 SQL 注入
- $ 傳入的參數在 SQL 中直接顯示爲傳入的值,$ 方式無法防止 SQL 注入
其他區別
- 傳入的參數在 SQL 中顯示不同
- #{} 爲參數佔位符?,即 SQL 預編譯
- # 傳入的參數在 SQL 中顯示爲字符串(當成一個字符串),會對自動傳入的數據加一個雙引號。
- ${} 爲字符串替換,即字符串拼接
- $ 傳入的參數在 SQL 中直接顯示爲傳入的值
- # 可以防止 SQL 注入的風險(語句的拼接);但 $ 無法防止 SQL 注,入。
- $ 方式一般用於傳入數據庫對象,例如,傳入表名。
- 大多數情況下還是經常使用 #,一般能用 # 的就別用 $;但有些情況下必須使用 $,例:MyBatis 排序時使用 Order By 動態參數時需要注意,用 $ 而不是 #。
- 執行流程
- #{}:動態解析 --> 預編譯 --> 運行
- ${}:動態解析 --> 編譯 -->運行
- 變量替換
- #{}:變量替換是在DBMS(數據庫管理系統)中,會對對應的變量自動加上''
- ${}:變量替換實在DBMS外,不會對對應的變量加上''