HaloDao之全自動動態多條件查詢組件實現API(二)

https://github.com/VonChange/haloDao-Hibernate3

基本條件查詢

  • 等於查詢:eq
findListByMap(new HaloMap().set("userName_eq","vonchange"));
  • 不等於查詢:neq
findListByMap(new HaloMap().set("userName_neq","vonchange"));
  • 大於查詢:gt
findListByMap(new HaloMap() .set("createTime_gt","2015-02-01"));
  • 小於查詢:lt
findListByMap(new HaloMap().set("createTime_lt","2015-02-01"));
  • 大於等於:ge
findListByMap(new HaloMap().set("createTime_ge","2015-02-01"));
  • 小於等於:le
findListByMap(new HaloMap().set("createTime_le","2015-02-01"));
  • 包含:in
  findListByMap(new HaloMap().set("userName_in",new String[]{"a","e"}) );
  • 不包含:notin
  findListByMap(new HaloMap().set("userName_notin",new String[]{"a","e"}) );
  • 不是:not
findListByMap(new HaloMap().set("userName_not","e")) );
//查詢用戶名不爲e結果集(包含null值情況)
  • 模糊查詢
 findListByMap(new HaloMap().set("userName_like","e")) );
 //右模糊爲e的用戶名結果集,即默認右模糊查詢--可以使用索引
 findListByMap(new HaloMap().set("userName_5like5","e")) );
 //全模糊查詢(鍵盤5對應符號%)
 findListByMap(new HaloMap().set("userName_5like","e")) );
 //左模糊查詢
  • 日期模糊查詢
findListByMap(new HaloMap().set(createDate_monthlike,'2014-12') ) );
//查詢2014年12月份的結果集
/**其中前綴爲:day(dd) 天 month(MM)月 year(yyyy)年 hour(HH) 小時  minute(mm) 分 second(ss) 秒*/
findListByMap(new HaloMap().set(createDate_ddlike,'2014-12-18') ) );
//查詢2014年12月18日的結果集
  • 從某個日期到某個日期
findListByMap( new HaloMap().set(createDate_monthge,'2014-11').set(createDate_monthle,'2015-02'));  
//查詢從2014月11月到2015年02月份的結果集
/**
符合國人思維:包含2014年11月,12月及其2015年的1月和2月
如果從2015年02月到2015年02月,那麼相當與2015年02月的數據集,前綴和日期模糊查詢相同.
*/
  • 排序(可追加的addOrder)
  findPageByMap(new HaloMap().set("userName_like","change").addOrder("createDate_desc").addOrder("userName").addOrder("updateTime","id"));
  //查詢名字右模糊change的數據集並分頁,並按照createDate倒序,userName正序,updateTime正序和id正序
  /**
  如果前臺或者代碼使用set,要這麼寫:
  */
  findPageByMap(new HaloMap().set("userName_like","change").set("addOrder","createDate_desc").set("addOrder","updateTime"));
  //前臺要不傳addOrder對應的數組,要不就得按順序寫addOrder參數
  • 分組
 findPageByMap(new HaloMap().set("userName_like","change").addGroup("role"));
 //查詢按role分組的用戶名右模糊change的結構集
  /**
  這個因爲這個版本依託hibernate,實現了hql可以分組,但未經考驗,但hibernate中sql動態條件拼接實現可以放心使用!
  */
  • 或和組的查詢
  //程序中使用
findListByMap(new HaloMap().set("(userName_eq|","change")
 .set("email_eq)","[email protected]");
 //前臺如果傳值使用
 findListByMap(new HaloMap().set("_9userName_eq1","change")
 .set("email_eq0","[email protected]");
 //查詢用戶名爲change或者email爲[email protected]的數據集
  • 數字對應字符特別說明

在程序中你可以使用任意字符作爲key字段,但在前臺我們使用json作爲key-value,key不可以不符合編碼規範,所以使用數字替換字符
9對應( 0對應) 3對應# 5對應% 這些可以從你的鍵盤看出對應關係>-<
而 8對應. (鍵盤對應*) 1對應|(鍵盤對應!) 這個是象形文字,恩…

  • 查詢某些字段封裝到實體
    findListByMap(new    HaloMap().set("userName_like","change").addColumn("userName_eq","passWord").addColumn("email");
 // 查詢是實體中用戶,密碼,郵箱字段並封裝到實體中
 /**
 同樣不建議在hibernate下使用,hibernate下的sql分組實現可以使用.
 */
  • 查詢第一條記錄
findFirstByMap(new HaloMap().set("userName_eq","change"));
findListByMap(Map<String,?> parameter, int begin, int end));
//查詢從begin到end條數據.
/**
不想獨立個方法可以使用:
*/
findListByMap(new HaloMap().set("userName_eq","change").set("addEnd",3)
.set("addBegin",1))
//(對應HaloMap中的addEnd()和addBegin()方法)
  • where條件後面複雜查詢需求
findPageByMap(new HaloMap().sets("aa_hql","von"+"%","[email protected]");
或 findPageByMap(new HaloMap().addHql("aa").set("userName","von"+"%")
.set(email,"[email protected]");
/**
在 halo包下同名實體的xml中的hql標籤定義id爲aa的值:userName like :userName and email =:email
 (注:起個名很費腦啊!直接id爲aa到zz,簡單暴力(>-<) 而作爲片段有時沒啥意義) 
*/
//同名xml文件可以放到halo包下任意子包下,但不允許重名!   
/**
該片段hql放到xml中,便於管理,且完全防止了sql注入的可能.當然犧牲了部分便利,麻煩些.
*/   
  • 站位符傳參:prm
.set("userName_prm":"von"+"%");
//中的給hql片段中爲:userName的佔位符複製
  • 檢查必須存在值:ck
 findListByMap(new HaloMap().set(userName_eq_ck,null));
 //比如前臺傳了空值,但邏輯上是不允許空的,這是程序會報錯,意思你如果必須,則需要進行判空效驗
  • 日期可以傳字符
 new HaloMap().set(createDate_ge,'2012-11').set(createDate_ge,'2012年11月12日'))
  // 支持的格式可以統一在halo.config包下的halo.xml中配置
  //對於不支持格式也可以set(createDate_ge?yy年11月,'12年11月')
  • 自動根據實體類型類型轉換
//比如:
findListByMap(new HaloMap().set("money","17.8")
.set("flag",1);
//money爲BigDeciaml而flag爲Boolean型
  • 可以將下劃線_理解成空格

以上基本滿足了where條件後面的查詢需求

  同時你也發現了,map並沒有採用接口類,而是自己寫的實現類 意思是你必須的,確定的以及肯定的,搭配這個haloMap才行.因爲只有倆者相結合纔可以練就絕世武功啊!

HaloMap的使用

  • 鏈式調用
new HaloMap().sets("aa_hql","von"+"%","[email protected]").set("userName_prm":"von"+"%").set("addGroup","userName").set("id",1);
  • 可以點出方法
HaloMap().addOrder("createTime_desc").addColumn("role","userName").addColumn("id").addGroup("role");
//裏面提供淺顯易懂的方法,讓你不會哪裏點哪裏,so easy!

刪除更新

  同時因爲刪除更新操作除了where語句前不同 其他可以重用 很容易的編寫出根據halomap更新和刪除方法
- 刪除

 deleteByMap(new haloMap().set("userName_like","change");
 //刪除用戶名左模糊爲von的結果
  • 修改
updateWithNotNullByHql(new BaseUser().setRole(1),new haloMap().set("userName_like","change"));
 //默認不更新爲null的字段

泛型Dao和Service接口

1.提供泛型Dao和Service接口,使Dao層繼承,基本可以或者不用再寫到Dao層代碼,並且基本Service層的CRUD也可以免掉!
2.同時配合代碼生成,基本只要關心邏輯就可以了!

  那麼挖掘技術就到此爲止了嗎?到現在她只不過是個基於hibernate的組件而已 當然也可以編寫成爲基於其他的比如dbutils或者mybatis的組件.但她畢竟只是個組件罷了.
  我相信前輩會有人類似實現過,但到這種程度的挖掘技術也只能算是平分秋色罷了,而下面纔是重頭戲:是她能夠自立門派,成爲一代宗師,走向人生巔峯,想想都有一些小激動的原因.

下篇介紹她的第二大特性,但還未真正完美的實現.

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