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