需求背景
作為一名Java CRUD Coder,日常開發(fā)中會遇到類似的需求:通過下拉列表選擇“是”或“否”來對數(shù)據(jù)庫中的數(shù)據(jù)進行篩選。如果此時前端的傳參是boolean
類型的true
和false
,后端Mapper層的代碼可能會遇到需要構造類似if (param.existFlag) and table.id not in (xxxx1,xxxx2)這樣的條件查詢,如果你們的ORM框架使用的是MyBatis/MyBatis Plus,請看下文內容。
MyBatis參數(shù)映射
錯誤寫法
Java中在寫判斷條件時,可以使用:
if(existFlag) {
//do something
}
在MyBatis的XML中,不可以使用類似的寫法:
<if test="param.existFlag">
AND id = 1
</if>
正確寫法
<if test="param.existFlag != null and param.existFlag == true">
AND id = 1
</if>
注意事項及優(yōu)化
缺陷
當我們需要在SQL中需要根據(jù)true、false、null執(zhí)行不同的邏輯時,盡管MyBatis支持上述寫法,但這種寫法難免不太容易理解。
<select id="selectUsersByFlag" resultType="User">
SELECT * FROM users
<where>
<if test="existFlag != null and existFlag == true">
AND id = 1
</if>
<if test="existFlag != null and existFlag == false">
AND id = 2
</if>
<if test="existFlag == null">
-- 處理字段為null的情況,此處略
</if>
</where>
</select>
既然true、false都需要判斷,那么這種寫法就相當于:
if (existFlag) {
// do something 1
} else if (!existFalg){
//do something 2
} else {
//do something 3
}
當if條件變得更多時,代碼的邏輯結構顯然會變得更臃腫,不易理解。那么我們需要再優(yōu)化一下。
優(yōu)化
在Java中,當判斷條件變多時,可以使用switch
語句、策略模式等方案優(yōu)化,那么在MyBatis中可以使用<choose>
進行優(yōu)化。
MyBatis中的<choose>
標簽用于在多個條件中選擇第一個滿足條件的子句。類似于Java中的switch
語句,<choose>
標簽可以根據(jù)不同的條件選擇執(zhí)行不同的SQL
子句,提高SQL
語句的靈活性和可讀性。
以上代碼可以優(yōu)化為:
<select id="selectUsersByFlag" resultType="User">
SELECT * FROM users
<where>
<choose>
<when test="existFlag != null and existFlag == true">
AND id = 1
</when>
<when test="existFlag != null and existFlag == false">
AND id = 2
</when>
<otherwise>
and id = 3
</otherwise>
</choose>
</where>
</select>
同樣,也可以使用case
、when
優(yōu)化:
SELECT *
FROM users
WHERE
CASE
WHEN existFlag = true THEN id = 1
WHEN existFlag = false THEN id = 2
ELSE
END
寫到最后的一點想法
作為一名程序員,我們的代碼首先要保證功能可用,在功能可用的前提下,要保證代碼質量可讀性、安全、性能等。吾日三省吾身,多思考一下代碼如何能寫的更好,這要求我們需要不斷探索代碼的最佳實踐。
保持持續(xù)學習的態(tài)度,每天優(yōu)化一點點,一點點改進,從而寫出更加優(yōu)雅、高效和安全的代碼。
后續(xù)內容文章持續(xù)更新中…
近期發(fā)布。
關于我
????你好,我是Debug.c。微信公眾號:種棵代碼技術樹 的維護者,一個跨專業(yè)自學Java,對技術保持熱愛的bug猿,同樣也是在某二線城市打拼四年余的Java Coder。
??在掘金、CSDN、公眾號我將分享我最近學習的內容、踩過的坑以及自己對技術的理解。
??如果您對我感興趣,請聯(lián)系我。
若有收獲,就點個贊吧,喜歡原圖請私信我。文章來源:http://www.zghlxwxcb.cn/news/detail-826744.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-826744.html
到了這里,關于優(yōu)化MyBatis查詢條件:從Boolean類型判斷到<choose>標簽的進化的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!