多重篩選引發取巧的設計思路

2021-09-27 07:55:35 字數 2486 閱讀 4401

想和大家分享一下現在喜悅的心情,因為解決了乙個比較刁鑽的問題,很開心。

今天在寫**的時候,要實現乙個功能:多層篩選。條件是這樣的:我們可以分別通過學生學號、學生姓名以及班級名稱,來輸出查詢到的學生列表,也可以依靠其中的兩個條件來查詢(此時另外乙個條件值為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...