1. 程式人生 > >Mybatis配置檔案中某些屬性的值中有特殊符號的處理方式

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,具體的方式是把包含特殊字元的內容放在<![CDATA[ ]]>裡,

    比如: select * from userinfo where <![CDATA[ id > 100 ]]>   

  2)使用替代符號,這些特殊字元都有對應替代符號,常用的如下:

       &lt;          < 
        &gt;          >  
        &amp;      & 
        &apos;      '
        &quot;      "

    比如上個例子也可以這樣寫: select * from userinfo where id &gt; 100.

三、$和#的區別

  在我們設計動態sql語句的時候,通常會涉及到引數傳遞的問題,mybatis允許在動態語句中引用引數名。引用方式即通過$或#,但這兩者是有區別的,具體的區別在於:

  1) 使用#會進行預編譯,mybatis能把引數轉化為對應的型別,而$則是將變數的值原樣照搬,不會做任何處理

  2)使用#可以防止SQL注入,而使用$是無法防止的。

  這就有點想我們平時在程式中寫SQL語句,使用佔位符和直接拼接一樣。再舉一些例子說明一下:

  比如如果是一個變數userId的值是100,則語句可以這樣寫:

  select * from userinfo where id = #{userId},  也可以寫成select * from userinfo where id = ${userId},因為最終的語句都是select * from userinfo where id = 100.

       但假設有變數是username值為macs524。則對於

  select * from userinfo where username = #{username}來說,其結果是select * from userinfo where username = 'macs524'

       而如果換成${username},則其結果為select * from userinfo where username = macs524,這個是有問題的。

  通常在欄位設定值的時候,我們要使用#而不是$,但$也不是沒有任何用處,比如,假設我們的SQL表名是一個變數tbl_name,則查詢語句應該寫為

   select * from ${tbl_name},而這個時候用#就不合適了。

  總之,#和$的主要差別就在於一個會預編譯,一個不會,瞭解了這點差別,其適用場合也就容易理解了。