想和大家分享一下現在喜悅的心情,因為解決了乙個比較刁鑽的問題,很開心。
今天在寫**的時候,要實現乙個功能:多層篩選。條件是這樣的:我們可以分別通過學生學號、學生姓名以及班級名稱,來輸出查詢到的學生列表,也可以依靠其中的兩個條件來查詢(此時另外乙個條件值為null),當然也能夠使用三個條件來查詢。
第乙個思路就是,分別判斷這三個條件是否為空,然後分別呼叫三個已有的sql方法。
/**
* 查詢指定id的學生資訊
* @param id 學生id
* @return 學生實體
*/student querybyid(integer id);
/*** 查詢某班所有學生
* @param class_id 班級id
* @return 學生實體列表
*/listquerybyclassid(integer class_id);
/*** 通過名字查詢學生(可能不止乙個)
* @param name 學生姓名
* @return 學生實體列表
*/listquerybyname(string name);
這個思路很快就被我否決了,原因就是太麻煩,判斷太多,最後還得整理結果,絕對的**煩。
第二個思路,辛苦一點,寫的sql方法多一些,例如按照學生姓名和學生學號聯合查詢;學生姓名和班級聯合查詢等,但是我轉頭又想了想,也否決了,因為也很麻煩——目前而言是三個條件的篩選,只需要再寫四個sql即可,那如果再多加幾個條件呢?那我豈不是得猝死在寫方法的途中?(我也許僥倖不死,頭髮定會中道崩殂)
第三個思路,這是最為輕鬆的思路,因為這個思路就是……否決這個功能即可。。。
好的,讓我們忽略第三個思路,來看一下我最後的實現。
思路就是,見**:
工具類判空方法:
/**
* 如果是空,則換成替換符%
* @param obj 判空物件
* @return 返回物件tostring方法,或者返回%
*/public static string ifnull(string obj)
return obj;
}
通用功能介面新添方法:
/**
* 通過給定條件,篩選某錶中的實體列表
* @param filter 不定數條件
* @return 實體列表
*/list<? extends bean> queryfilter(string...filter);
注意,student類實現了bean介面(所有實體都實現此介面,保證了通用功能的適用性)
studentdaoimpl重寫此方法:
@override
public listqueryfilter(string... filter)
string sql = "select * from students " +
"where id like ? and name like ? " +
"and age like ? and gender like ? " +
"and tel like ? and class_id like ?";
return dbutils.query(sql, new beanlisthandler(student.class), filter);
}
解釋一下最後一句**,它的作用就是,將filter陣列中的資料替換sql語句裡的?,然後執行sql語句,返回學生列表。
好處就是,我們不必寫大量巢狀判斷和重複使用sql語句,我們能用乙個方法解決問題,並且在之後遇到類似的篩選時,此方法也能套用(屬於通用方法);缺陷也很明顯,引數數量不確定,開發過程中容易寫錯引數個數(或順序),執行效率不高。
不管好壞,總之,我認為這個設計思路還是很有前途的,應該能夠在此基礎上繼續改造出更為完善的方法。
2019-09-24 後記:
今天學習了一下多重篩選,然後發現,其實最好的實現方法是這樣的:
通用功能介面新添方法:
/**
* 通過給定條件,篩選某錶中的實體列表
* @param map 對映條件
* @return 實體列表
*/list<? extends bean> queryfilter(mapmap);
同樣的,也是所有的dao層實現類都實現此方法,仍然以studentdaoimpl為例:
@override
public list<? extends bean> queryfilter(mapmap)
return dbutils.query(sql.tostring(), new beanlisthandler(student.class), values.toarray());
}
Python中斷多重迴圈的幾種思路
i.跳出單迴圈 不管是什麼程式語言,都有可能會有跳出迴圈的需求,比如列舉時,找到乙個滿足條件的數就終止。跳出單迴圈是很簡單的,比如 for i in range 10 if i 5 print i break然而,我們有時候會需要跳出多重迴圈,而break只能夠跳出一層迴圈,比如 for i in ...
多重迴圈篩選10元以下的金額(筆記)
中國大學mooc 湊硬幣 用1角,2角,5角的硬幣,湊出10元及以下的硬幣。利用多重迴圈 思路整理 10元最多可以用100個1角的硬幣代替,最多可以用50個2角 20個5角的硬幣。由此,可以設想,將1角的硬幣定為乙個,剩下的硬幣用2角的和5角的進行組合 將乙個變數固定,剩下的兩個變數進行組合挑選,當...
關於做多個條件進行篩選的思路
對三個陣列逐個比較,先兩兩比較,最後合成乙個新的版本,但是還有弊端就是如果條件多了,就要進行函式的遞迴吧,怎麼寫呢,後期完善。for ttcourse c1 inself arr finalycourse addobjectsfromarray self arr finalycourse addob...