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},而這個時候用#就不合適了。

 

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

 

轉載:https://www.cnblogs.com/macs524/p/5666651.html?utm_source=itdadao&utm_medium=referral

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章