Mybatis中isNotNull與isNotEmpty的使用心得
isNotNull與isNotEmpty使用心得
做開發工作時間長瞭,會發現,在需求逐步梳理清晰以後,大致的方向已經明確瞭。此時會進入細節開發環節,是最繁瑣,也是決定開發質量的關鍵階段。最近遇到瞭一個生產問題,必填字段的值,清空保存,無法保存成功。
具體業務需求是這樣的
客戶的基本信息,坐席可以保存,也可以提交後端系統進行審批。
1,保存的時候,其實就是一個暫存的功能,隻要坐席輸入的是合法的值,都要保存入庫。
2,提交審批的時候會進行各種校驗,包括合法性校驗、必填校驗,業務邏輯校驗等等。
生產問題就出在這個保存的功能上,如果一個字段有值,但是坐席清空,點保存,這時候保存沒有生效。
問題其實也很好定位,我去看瞭一下代碼就找到問題瞭。但是這個問題在生產上一直存在的。
主要是不是阻斷性問題,影響不大,所以可能有的坐席發現瞭,也沒有在意,沒有報生產問題。
原因就是:本該使用isNotNull的地方,缺使用瞭isNotEmpty
以上是從業務的角度來分析的,接下來,我們從技術角度來看一下這個問題。
isNotNull
,顧名思義,就是不為null,也就是<>nullisNotEmpty
,顧名思義就是不為空,也就是<>null,並且<>''(空字符串)
區別也很明顯,就是是否包含空字符串。針對上面的業務場景,我們需要保存空字符串,該什麼哪個呢
看一下下面2個SQL語句
UPDATE PRODUCT P SET UPDATE_TIME = SYSDATE <isNotEmpty prepend="AND" property="productName"> P.PRODUCT_NAME = #productName# </isNotEmpty> WHERE P.PRODUCT_ID = #productId#
UPDATE PRODUCT P SET UPDATE_TIME = SYSDATE <isNotNull prepend="AND" property="productName"> P.PRODUCT_NAME = #productName# </isNotNull> WHERE P.PRODUCT_ID = #productId#
當頁面傳遞過來的值為空字符串時,我們要保證能執行對PRODUCT_NAME的修改,很顯然,需要使用isNotNull標簽。
出問題的原因其實也簡單,就是復制粘貼的代碼,也沒有註意到isNotNull與isNotEmpty的區別。
所以平時我們還是要細心,關鍵心中要有分寸,如果你很清楚的知道isNotNull與isNotEmpty的區別,一旦看到這個,你自然就會想到該如何使用。
isNull, isNotNull與isEmpty, isNotEmpty區別
關於這個看瞭很多例子都很模糊
- 在iBATIS中isNull用於判斷參數是否為Null,isNotNull相反
- isEmpty判斷參數是否為Null或者空,滿足其中一個條件則其true
- isNotEmpty相反,當參數既不為Null也不為空是其為true
例子
<update id="updateYbAndSb" parameterClass="java.util.HashMap"> UPDATE MZSF_CLININVOINFO T <dynamic prepend="SET"> <isNotNull property="YBZHCODE"> <isEmpty property="YBZHCODE" prepend=","> T.YBZHCODE = NULL</isEmpty> <isNotEmpty property="YBZHCODE" prepend=","> T.YBZHCODE = #YBZHCODE#</isNotEmpty> </isNotNull> <isNotNull property="HOSPID"> <isEmpty property="HOSPID" prepend=","> T.HOSPID = NULL</isEmpty> <isNotEmpty property="HOSPID" prepend=","> T.HOSPID = #HOSPID#</isNotEmpty> </isNotNull> <isNotNull property="SBZFJE"> <isEmpty property="SBZFJE" prepend=","> T.SBZFJE = NULL</isEmpty> <isNotEmpty property="SBZFJE" prepend=","> T.SBZFJE = #SBZFJE#</isNotEmpty> </isNotNull> <isNotNull property="SBZFXJJE"> <isEmpty property="SBZFXJJE" prepend=","> T.SBZFXJJE = NULL</isEmpty> <isNotEmpty property="SBZFXJJE" prepend=","> T.SBZFXJJE = #SBZFXJJE#</isNotEmpty> </isNotNull> </dynamic> WHERE T.SFID = #SFID# AND T.FORGID = #FORGID# </update>
上面sql語句,如果 YBZHCODE傳入的是null 即:
hashMap.put("YBZHCODE",null);
則sql語句中不會更新這個字段
如果YBZHCODE傳入的是空 即:
hashMap.put("YBZHCODE",“”);
則sql語句 會將這個字段更新成null,為空
如果有值,則更新成傳入的值
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- go zero微服務高在請求量下如何優化
- Entity Framework使用DbModelBuilder API創建表結構
- mybatis plus實現條件查詢
- 非常全面的Java SpringBoot點贊功能實現
- Oracle根據時間查詢的一些常見情況匯總