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的組件.但她畢竟只是個組件罷了.
我相信前輩會有人類似實現過,但到這種程度的挖掘技術也只能算是平分秋色罷了,而下面纔是重頭戲:是她能夠自立門派,成爲一代宗師,走向人生巔峯,想想都有一些小激動的原因.