1. 參數占位符
1.1?#{}?和?${}?的區別
- #{}?占位符
- 作用:安全傳參。MyBatis在執行SQL時,會把#{}替換成?,然后用參數值自動填充。
- 優點:可以防止SQL注入,推薦使用。
- 例子:
select * from user where id = #{id}
實際執行時會變成:select?*?from?user?where?id = ?,參數由MyBatis自動設置。
- ${}?占位符
- 作用:字符串拼接。MyBatis會直接把${}里的內容拼到SQL語句里。
- 缺點:容易造成SQL注入風險,不推薦用于傳遞用戶輸入的參數。
- 例子
select * from ${tableName}
如果tableName參數是user,實際SQL就是select?*?from?user。
1.2 使用時機
- 參數傳遞(如where條件、值等):都用#{},安全!
- 動態設置表名、列名:只能用${},因為表名/列名不能用?占位。
2.?parameterType?屬性
- 作用:用于設置Mapper方法參數的類型。
- 說明:如果參數類型能被MyBatis自動推斷出來,可以省略不寫。
- 例子:
<select id="selectById" parameterType="int">select * from user where id = #{id}</select>
但如果你的Mapper接口方法參數已經寫明類型,這里可以省略
3. SQL語句中的特殊字符處理
- 轉義字符:如果SQL中需要寫特殊字符(如<、>、&等),需要轉義。
- <![CDATA[?... ]]>:這是XML中的一種寫法,表示里面的內容不需要被XML解析器處理,可以直接寫SQL語句,包括特殊字符。
- 例子:
<select id="select"><![CDATA[select * from user where name like '%a%']]></select>
- 好處:防止XML解析器把SQL里的特殊字符當成標簽或報錯。
總結口訣
- 傳參用#{},拼接用${},表名列名才用${},防注入要記住。
- parameterType能省則省,類型一致最保險。
- 特殊字符用<![CDATA[ ... ]]>包裹,寫SQL更自由。