這幾天在學習使用IBATIS突然要使用模糊查詢以及動態多個條件查詢按照自己的想法試了很久都沒解決這個問題
首先是模糊查詢的問題開始時我使用如下條件:select * from user where name like %#value#% 可是怎麼也不行好像還報錯了後來在網上找到了解決方法就是使用$來代替#號
>寫成: like %$value$% 就可以了<! 模糊查詢不能用##是用prepareStatement的?插入參數$是文本替換 >
>同時還找到另一個方法但是那個方法我試了很久就是不行方法為: like % || #value# || % 查詢出來的結果居然是全部後來在網上有人說這個寫法是oracle的寫法
>如果是mysql則應該寫成: name like CONCAT(%#value:VARCHAR#%) 不過我沒試用過反正有一個方法成功就可以了
第一個方法我試用成功後面的也就沒試過有興趣的朋友可以試試
第二個大問題就是多條件組合查詢開始時我也在想這個問題總不能為每一個查詢都寫一個SQL配制吧這樣太後來參考一些文檔發現原來IBATIS裡提供了動態映射示例如下:
<!
在ibatis中使用安全的拼接語句動態查詢
ibatis比JDBC的優勢之一安全高效
說明文字在注釋中
>
<select id=selectAllProducts parameterClass=Product resultMap=ProductResult>
select idnote from Product
<dynamic prepend=WHERE>
<! isNotNull判斷參數是否存在Integer類型 >
<isNotNull property=id>
<! isGreaterThan判斷參數是否大於compareValueisGreaterEquals是大於等於 >
<isGreaterThan prepend= and property=id compareValue=>
id = #id#
</isGreaterThan>
</isNotNull>
<! isNotEmpty判斷字串不為空isEmpty可以判斷字串為空 >
<isNotEmpty prepend= and property=note>
<! 模糊查詢不能用##在是用prepareStatement的?插入參數$是文本替換 >
note like %$note$%
</isNotEmpty>
</dynamic>
</select>
用Map傳參數
<select id=selectAllProducts parameterClass=javautilHashMap resultMap=ProductResult>
select idnote from Product
<dynamic prepend=WHERE>
<! isPropertyAvailable判斷屬性是否有效 >
<isPropertyAvailable property=id>
<isNotNull property=id>
<! isLessThan判斷參數是否小於compareValueisLessEquals是小於等於 >
<isLessThan prepend= and property=id compareValue=>
id = #id#
</isLessThan>
</isNotNull>
</isPropertyAvailable>
</dynamic>
</select>
<!幾個常用屬性>
<isPropertyAvailable> 屬性是存在
<isNotPropertyAvailable> 屬性不存在
<isNull> 屬性值是null
<isEmpty> 判斷Collectionsize<或Stringlength()<
<isEqual> 等於
<isNotEqual> 不等於
<isGreaterThan> 大於
<isGreaterEqual> 大於等於
<isLessThan> 小於
<isLessEqual> 小於等於
以下是引用一個文章大家可以參考一下 ml
iBatis 開發指南告訴我們當 Person 對象的 name 屬性不為 null 時啟用 name 查詢條件在映射文件 personxml 中的配置為
<select id=getPersonsByName resultClass=comunmiPerson>
select id as idname as namepasswd as passwd from person
<dynamic prepend=WHERE>
<isNotNull prepend=AND property=name>
(name like #name#)
</isNotNull>
</dynamic>
</select>
<select id=getPersonsByName resultClass=comunmiPerson> select id as idname as namepasswd as passwd from person <dynamic prepend=WHERE> <isNotNull prepend=AND property=name> (name like #name#) </isNotNull> </dynamic> </select>
再用如下的代碼調用
Person person = new Person();
personsetName(unmi);
List list = sqlMapqueryForList(getPersonsByName person);
Person person = new Person(); personsetName(unmi); List list = sqlMapqueryForList(getPersonsByName person);
執行效果翻譯成 sql 語句就是
select * from person where name like unmi
select * from person where name like unmi
這實際上是一個完全匹配的查詢與用等號寫成如下語句是一致的
select * from person where name = unmi
select * from person where name = unmi
我們之所以要用 like 謂詞一般都想實現模糊查詢比如說 name 以 unmi 開始結束或包含 unmi 的記錄如下
select * from person where name like unmi%;
select * from person where name like %unmi;
select * from person where name like %unmi%;
select * from person where name like unmi%; select * from person where name like %unmi; select * from person where name like %unmi%;
也就是如上的 like 語義在 personxml中應該怎麼表述呢?我曾經是想當然的嘗試把
(name like #name#) 寫成 (name like %#name#%) 或 (name like %#name#%) 都沒法通過分別報錯
javasqlSQLException: Invalid argument in JDBC call: parameter index out of range:
和
javasqlSQLException: Unexpected token: % in statement [ select id
那麼正確的寫法是什麼呢?在網上找到一個解答 How do I use LIKE in my queries方法有兩種
是把上面 (name like %#name#%) 的 # 換成 $ 也就是 (name like %$name$%)
是用 || 連接字符串的方式寫成 (name like % || #name# || %)
但卻不能寫成 (name like %||$name$||%) 不能又要出錯
javasqlSQLException: Column not found: UNMI in statement [select id
總結一下在 iBatis 中用 like 的模糊查詢的配置如下(兩種方式)
<select id=getPersonsByName resultClass=comunmiPerson>
select id as idname as namepasswd as passwd from person
<dynamic prepend=WHERE>
<isNotNull prepend=AND property=name>
(name like %$name$%)
<! (name like %||#name#||%) >
</isNotNull>
</dynamic>
</select>
<select id=getPersonsByName resultClass=comunmiPerson>
select id as idname as namepasswd as passwd from person
<dynamic prepend=WHERE>
<isNotNull prepend=AND property=name>
(name like %$name$%)
<! (name like %||#name#||%) >
</isNotNull>
</dynamic> </select>
不知細心的諸位注意到沒有這同時也是我在組織上面文字時產生的疑問
寫成 (name like %||$name$||%) 為什就不行呢?# 和 $ 有什麼區別呢?
還有明明是寫成的 unmi為什麼報錯的時候又是全大寫的 UNMI 呢?
具體的異同我們可能還需從源代碼中找簡單的只要知道$name$ 是字面意義的替換這種形式要注意 SQL 注入的漏洞#name# 是帶類型的替換至於unmi被轉換成大寫還需再研究研究對於以上兩個疑問必要時還可以發揮一下也要權衡一下花那個時間值不值
From:http://tw.wingwit.com/Article/program/Oracle/201311/16940.html