https://github.com/VonChange/haloDao-Hibernate3
同爲程序猿的我們,相信你也厭倦了根據不同條件動態生成hql或者sql方式的代碼邏輯的編寫.大片大片的邏輯代碼,光看着就已經頭痛!
而halodao主要特性就是爲了解決這個頭痛麻煩的問題,並且實現方式可以說是極其的簡單暴力!並且我相信有許多人曾經也按這個原理實現過,只不過因爲其簡單而未深思.那麼她是咋實現的?她有何優點?爲啥不是在重複造輪子?
那麼要知道他的優點,首先要有比較的標準,也可以說是設計原則.下面是我的原則.
- 最最最極致的懶: 這懶不是複製黏貼,而是比她更高一層次的一個境界—連這兩動作,都懶得做.
- no think, only use: 儘可能少的思考,少的記憶.只要傻瓜般的使用,這同時也是懶的表現.
- 不爲萬分之一需求而實現,而是要尋求曲線救國方式.
- 簡單不過度設計.
先來看看現在的我們解決該問題的方案,並看看他們的不足之處:
- 最原始的的手動sql拼接和存儲過程拼接:先不說程序猿水平的不同,代碼也各異,代碼爛不說,維護性更差,這是最差解決方案.
- mybatis的動態sql:將邏輯代碼放到了xml中,維護性高,代碼規範,但是單不說其爲了規範,略顯複雜的xml編寫,大片的邏輯代碼寫在xml,不光復制黏貼累,看代碼也特別累.這違背了極致懶人原則.
- 基於hibernate的criteria的條件拼接:使用面向對象方式實現,優雅高大上,並且強大到可以拼接複雜查詢.但對於絕大數人來說,基本也就能記住他基本查詢,複雜的很難記住,當然可以查api.但就這功夫,不如直接寫hql或者sql來的簡單暴力,畢竟現如今,大多程序猿們只是爲了完成任務而敲代碼罷了,管她個是否優雅.她違背了簡單不過度設計,比較之後我的實現,她真心是設計過度了.
上面方式比較成熟,但對於極致懶人的需求,我希望前臺傳參並自動拼接成hql或者sql進行查詢,也就是說不僅後臺可以自動拼接條件,前臺也可以改變拼接條件.
基於該實現,我曾百度,尋找先例,找出不成熟的實現方式.
- 基於HIBERNATE的全自動查詢框架
實現方式是使用criteria,但criteria實現方式便是拼接hql,這樣暫不說從前臺傳的值繁瑣,封裝成criteria,豈不是非得通過一箇中介收費嗎?- 銳道的Dorado7基於hibernate的實現動態條件拼接的實現:Dorado7高級查詢條件構造器和Dorado7 Hibernate Addon.
他們做法和第一個相似,不夠在dorado世界裏算是成熟的了.而且我的最初版本是在dorado中的hibernate下做的,保留了她的Page對象實體寫法和她基於spingside的hibernate的baseDao寫法.- 理想中的SQL語句條件拼接方式
基本想法和我一樣,但不夠成熟,實現方式不夠靈活.
說了這麼多,那麼我是怎麼做的?
不難發現前臺有許多需求是這樣的,前臺有幾個輸入框,如果未輸入,那麼就不需要查詢.即邏輯判斷爲,不爲Null並且不爲空的值進行查詢.那麼前臺如何傳條件是個問題.瞭解但未實踐過nosql,他將數據庫實現了基於key-value方式,把字段信息含在了key值當中,那麼爲什麼我不可以將字段和條件放到一個key值當中呢?於是便產生了該全自動查詢的實現.
於是基本查詢代碼是這樣的:
findListByMap(new HaloMap().set("userName_eq","change").set("password_eq","654321").set("email_eq",null));
//爲查詢用戶名爲change和密碼爲654321的結果集.
而後臺並不是所有情況是空值不查詢,那麼你咋任性(RX)的查Null值或者空值呢?
findListByMap(new HaloMap().set("userName_eq","change").set("password_eq","654321").set("email_eq_rx",null));
//查詢用戶名爲change和密碼爲654321且郵箱爲空的結果集.
那麼前臺如何傳值?
HaloMap parameter= RequestUtils.getHaloMap(request);
List<User> users = userService.findListByMap(parameter);
/**前臺傳值:***.do?userName_eq=change&password_eq=654321&a=3即可,而普通a值是不會被識別查詢的.
*/
這種方式,正是理想中的SQL語句條件拼接方式博文的實現,方式略有不同,並且有進一步深入挖掘.但奇怪的是爲何沒人繼續像我這樣繼續挖掘,我想大概是因爲:
1.太過簡單,畢竟我現在實現該功能的核心代碼不到700行.簡單的代碼,羞於見人,怎能彰顯自己高深莫測的功力!
2.沒有繼續往下思考,只是停留在簡單的拼接而已,認爲最多也就這樣了,未考慮繼續深挖.
那麼問題來了,挖掘機技術哪家強,讓我先秀秀我的挖掘技術. 畢竟家鄉離藍翔技校可很近,相信你不會令你失望.(>-<)…..