今天中午回到工位已經是12:20多了,沒有時間睡覺了,本想著還能提前開始,結果看了點新聞之後,又是12:40了,所以新聞堅決不能看,執行力。
今天主要記錄一下mybatis中的特殊符號的問題,這個問題已經在面試中被問到了兩回了,但都沒答好,事不過三,記錄下來,下一次絕對不能再在這裡出問題了。
一、mybatis特點
同hibernate一樣,mybatis是乙個持久層框架,通過這個框架可以減化我們持久層**的開發。面試的時候我們會經常被問到這個框架同hibernate的比較,下面先羅列幾點mybatis的特點:
1)簡單易用,相比於hibernate的hql, session,實體狀態,一二級快取等過於複雜的概念,mybatis顯得小巧很多,弄清楚一兩個配置檔案,了解一下動態sql的語法,基本上就算是會用mybatis了,正因為簡單,所以有的時候會覺得這個框架沒有什麼可學的。
2)可以進行細緻的sql優化,因為sql是由開發者自己來設計的,所以更利於進行優化,而在使用hibernate時,sql是由框架生成的。
3)支援動態sql語句的編寫,有的時候我們需要根據不同的條件來修改乙個複雜sql的一部分書寫方式,用mybatis來做簡直再合適不過。
4)物件管理, hibernate有比較完整的物件管理機制,而在這一塊上mybatis是欠缺的,甚至物件和表的對映關係也需要自己定義。
以上只是個人想到的一些對比,不是很全。
二、特殊符號的使用
由於mybatis中的sql是寫在xml中的,由於xml語法的特殊性,對於一些特殊字元是需要特殊處理的,比如<,>,<=,>=,',"等,目前來說主要有兩種處理方式
1)使用cdata,具體的方式是把包含特殊字元的內容放在裡,
比如: select * from userinfo where 100 ]]>
2)使用替代符號,這些特殊字元都有對應替代符號,常用的如下:
< <
> >
& &
' '
" "
比如上個例子也可以這樣寫: select * from userinfo where id > 100.
三、$和#的區別
在我們設計動態sql語句的時候,通常會涉及到引數傳遞的問題,mybatis允許在動態語句中引用引數名。引用方式即通過$或#,但這兩者是有區別的,具體的區別在於:
1) 使用#會進行預編譯,mybatis能把引數轉化為對應的型別,而$則是將變數的值原樣照搬,不會做任何處理
2)使用#可以防止sql注入,而使用$是無法防止的。
這就有點想我們平時在程式中寫sql語句,使用佔位符和直接拼接一樣。再舉一些例子說明一下:
比如如果是乙個變數userid的值是100,則語句可以這樣寫:
select * from userinfo where id = #, 也可以寫成select * from userinfo where id = $,因為最終的語句都是select * from userinfo where id = 100.
但假設有變數是username值為macs524。則對於
select * from userinfo where username = #來說,其結果是select * from userinfo where username = 'macs524'
而如果換成$,則其結果為select * from userinfo where username = macs524,這個是有問題的。
通常在字段設定值的時候,我們要使用#而不是$,但$也不是沒有任何用處,比如,假設我們的sql表名是乙個變數tbl_name,則查詢語句應該寫為
select * from $,而這個時候用#就不合適了。
總之,#和$的主要差別就在於乙個會預編譯,乙個不會,了解了這點差別,其適用場合也就容易理解了。
四、總結
今天介紹了mybatis裡的一些細節上需要注意的地方,相信下次遇到這類問題,不會再出錯了。
mybatis中sql中的特殊符號
1.prefix 在trim標籤內sql語句加上字首。suffix 在trim標籤內sql語句加上字尾。suffixoverrides 指定去除多餘的字尾內容,如 suffixoverrides 去除trim標籤內sql語句多餘的字尾 prefixoverrides 指定去除多餘的字首內容 2.下面...
perl中特殊符號
陣列 x x名字前面是美元符號 後面是花括號 則其為 hash 元素 要引用整個 hash,使用百分號 作為字首。前面幾頁中使用的 hash 的名字為 family name。系統產生的一些可讀的資訊,也可能是出錯的資訊 子函式引數變數自己本身 子程式的私有變數 x 呼叫子函式x 資料輸入.如果沒有...
Bat 中特殊符號
隱藏命令的回顯。在for中表示使用增強的變數擴充套件 在set中表示使用擴充套件環境變數指定位置的字串 在set a中表示按位取反。使用兩個 包含乙個字串表示引用環境變數。比如乙個 time 可以擴充套件到當前的系統時間 單個 緊跟0 9的乙個數字表示引用命令列引數 用於for中表示引用迴圈變數 連...