什么时候用#{},什么时候用${}?
在Mapper.xml 里面配置傳入參數,有兩種寫法:#{} 、${}。作為OGNL 表達式,都可以實現參數的替換。這兩種方式的區別在哪里?什么時候應該用哪一種?
要搞清楚這個問題,我們要先來說一下PrepareStatement 和Statement 的區別。
1、兩個都是接口,PrepareStatement 是繼承自Statement 的;
2、Statement 處理靜態SQL,PreparedStatement 主要用于執行帶參數的語句;
3、PreparedStatement 的addBatch()方法一次性發送多個查詢給數據庫;
4、PS 相似SQL 只編譯一次(對語句進行了緩存,相當于一個函數),比如語句相同參數不同,可以減少編譯次數;
5、PS 可以防止SQL 注入。
MyBatis 任意語句的默認值:PREPARED
?
這兩個符號的解析方式是不一樣的:
#會解析為Prepared Statement 的參數標記符,參數部分用?代替。傳入的參數會經過類型檢查和安全檢查。
(mybatis-standalone - MyBatisTest - testSelect())
==> Preparing: select * from blog where bid = ? ==> Parameters: 1(Integer) <== Columns: bid, name, author_id <== Row: 1, leon, 1001 <== Total: 1 查詢結果:Blog{bid=1, name='leon', authorId='1001'}$只會做字符串替換,比如參數是leon,結果如下:
(mybatis-standalone - MyBatisTest - selectBlogByBean ())
==> Preparing: select bid,name,author_id authorId from blog where name = 'leon' ==> Parameters: <== Columns: bid, name, authorId <== Row: 1, leon, 1001 <== Total: 1 查詢結果:[Blog{bid=1, name='leon', authorId='1001'}]#和$的區別:
1、是否能防止SQL 注入:$方式不會對符號轉義,不能防止SQL 注入
2、性能:$方式沒有預編譯,不會緩存
?
結論:
1、能用#的地方都用#
2、常量的替換,比如排序條件中的字段名稱,不用加單引號,可以使用$
對象屬性是基本類型int double,數據庫返回null 是報錯
使用包裝類型。如Integer,不要使用基本類型如int。
If test !=null 失效了?
在實體類中使用包裝類型。
XML 中怎么使用特殊符號,比如小于&
?
1、轉義< < (大于可以直接寫)
2、使用<![CDATA[ ]]>——當XML 遇到這種格式就會把[]里面的內容原樣輸出,不進行解析
?
總結
以上是生活随笔為你收集整理的什么时候用#{},什么时候用${}?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何实现模糊查询LIKE
- 下一篇: 并发的发展历史-真空管和穿孔打卡