HaloDao之前後臺全自動動態多條件查詢組件實現(一)

  https://github.com/VonChange/haloDao-Hibernate3
  同爲程序猿的我們,相信你也厭倦了根據不同條件動態生成hql或者sql方式的代碼邏輯的編寫.大片大片的邏輯代碼,光看着就已經頭痛!
  而halodao主要特性就是爲了解決這個頭痛麻煩的問題,並且實現方式可以說是極其的簡單暴力!並且我相信有許多人曾經也按這個原理實現過,只不過因爲其簡單而未深思.那麼她是咋實現的?她有何優點?爲啥不是在重複造輪子?
  那麼要知道他的優點,首先要有比較的標準,也可以說是設計原則.下面是我的原則.

  1. 最最最極致的懶: 這懶不是複製黏貼,而是比她更高一層次的一個境界—連這兩動作,都懶得做.
  2. no think, only use: 儘可能少的思考,少的記憶.只要傻瓜般的使用,這同時也是懶的表現.
  3. 不爲萬分之一需求而實現,而是要尋求曲線救國方式.
  4. 簡單不過度設計.

  先來看看現在的我們解決該問題的方案,並看看他們的不足之處:

  1. 最原始的的手動sql拼接和存儲過程拼接:先不說程序猿水平的不同,代碼也各異,代碼爛不說,維護性更差,這是最差解決方案.
  2. mybatis的動態sql:將邏輯代碼放到了xml中,維護性高,代碼規範,但是單不說其爲了規範,略顯複雜的xml編寫,大片的邏輯代碼寫在xml,不光復制黏貼累,看代碼也特別累.這違背了極致懶人原則.
  3. 基於hibernate的criteria的條件拼接:使用面向對象方式實現,優雅高大上,並且強大到可以拼接複雜查詢.但對於絕大數人來說,基本也就能記住他基本查詢,複雜的很難記住,當然可以查api.但就這功夫,不如直接寫hql或者sql來的簡單暴力,畢竟現如今,大多程序猿們只是爲了完成任務而敲代碼罷了,管她個是否優雅.她違背了簡單不過度設計,比較之後我的實現,她真心是設計過度了.

  上面方式比較成熟,但對於極致懶人的需求,我希望前臺傳參並自動拼接成hql或者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.沒有繼續往下思考,只是停留在簡單的拼接而已,認爲最多也就這樣了,未考慮繼續深挖.


  那麼問題來了,挖掘機技術哪家強,讓我先秀秀我的挖掘技術. 畢竟家鄉離藍翔技校可很近,相信你不會令你失望.(>-<)…..

下篇介紹她的其它基本使用方法.

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