|
每做一個新的模塊都要寫一大堆組裝查詢條件的邏輯代碼,不小心有一個條件沒有用ignocase,又是一個BUG,可能你早已煩透了。
首先來看效果吧: 先看這個有六個條件的URL: .../findUsers.action?user.realName=lgd&user.phone=&user.age=20&user.age=30&user.organization.name=技術(shù)部&user.birthday=1980 用下面一行可以完成所有條件的封裝 Java代碼
具體用法:下載附件JAR包并導(dǎo)入到工程中,然后在任何地方使用上面那一句即可。 工具類做了這幾件事: 1、根據(jù)屬性類型對各種值轉(zhuǎn)型。 2、年齡條件有兩個,即20和30,因為是數(shù)值,自動使用>=和<=。 3、對于所在部門的名稱,是個關(guān)聯(lián)表字段,先創(chuàng)建別名,再拼條件。這個特點還支持無限級聯(lián),比如你可以寫一個很變態(tài)的URL參數(shù)aaa.bbb.ccc.ddd.eee.name=fff,只要你的實體確實有種關(guān)聯(lián),就可以拼裝。 4、手機字段條件沒有輸入值,不作為條件。 5、對于生日這個條件,組裝成>=19800101000000 and <=19801231235959 上面那一行把除了分頁外的工作都做了,你已經(jīng)可以拿這個criteria去查詢了,如果你不想分頁的話。分頁邏輯可在此基礎(chǔ)上進(jìn)行封裝,不在此討論范圍內(nèi)。hibernate打出的SQL類似這樣: Sql代碼
此工具類功能包含: 1、根據(jù)請求參數(shù)自動組裝條件--組裝結(jié)果是DetachedCriteria對象。 2、部份屬性查詢--即支持只查表中部份字段,且支持無限級聯(lián)。 3、范圍值的自動拆分,如日期,如查詢條件中對日期字段只給出一個值,那么會被拆分成兩個,只有年份的,拆成當(dāng)年第0秒和當(dāng)年最后一微秒,有年月的,拆分成當(dāng)月第0秒和當(dāng)月最后一微秒,以此類推,因為你永遠(yuǎn)不可能拿僅有4位年份構(gòu)造出工一個日期來和數(shù)據(jù)庫進(jìn)行相等比較,那不會是客戶要的結(jié)果。對于數(shù)字型的字段,一個值時,進(jìn)行相等比較,兩個值時,進(jìn)行between比較,不支持多于兩值。 4、支持或條件組裝,如URL為 user.realName|user.age=35,那么SQL為user.real_name=? or user.age=?。注意這時目標(biāo)頁面無法用${user.realName|...}取回原值,可以用${realName}取值。 此工具依據(jù)功能不同有三個同名的方法,上面是第一種,只具有自動拼裝條件功能,下面是剩下兩個方法的介紹 Java代碼
庫依賴說明: 1、xwork.core.2.16包,struts2.18版本帶有此包,代碼里面用到它的一個OnglUtil工具將查詢結(jié)果組裝成List<Pojo>,另外RequestUtil類使用ActionContext類取得當(dāng)前請求,僅此兩處依賴xwork包。 2、hibernate3.x,這是必不可少的。 補充: 1、支持除了java.sql.Date、Map屬性外的所有常用類型屬性條件拼裝,要支持這兩種只需要依葫蘆畫瓢實現(xiàn)IValueHandler接口就行了。 2、只要改寫AliasToBean類,很容易支持Struts2.0x版本。 3、集合屬性需為泛型。 4、支持POST提交表單。 5、類圖:
|
|
|