Mybatis中isNotNull與isNotEmpty的使用心得
isNotNull與isNotEmpty使用心得
做開發(fā)工作時間長了,會發(fā)現(xiàn),在需求逐步梳理清晰以后,大致的方向已經(jīng)明確了。此時會進入細節(jié)開發(fā)環(huán)節(jié),是最繁瑣,也是決定開發(fā)質量的關鍵階段。最近遇到了一個生產(chǎn)問題,必填字段的值,清空保存,無法保存成功。
具體業(yè)務需求是這樣的
客戶的基本信息,坐席可以保存,也可以提交后端系統(tǒng)進行審批。
1,保存的時候,其實就是一個暫存的功能,只要坐席輸入的是合法的值,都要保存入庫。
2,提交審批的時候會進行各種校驗,包括合法性校驗、必填校驗,業(yè)務邏輯校驗等等。
生產(chǎn)問題就出在這個保存的功能上,如果一個字段有值,但是坐席清空,點保存,這時候保存沒有生效。
問題其實也很好定位,我去看了一下代碼就找到問題了。但是這個問題在生產(chǎn)上一直存在的。
主要是不是阻斷性問題,影響不大,所以可能有的坐席發(fā)現(xiàn)了,也沒有在意,沒有報生產(chǎn)問題。
原因就是:本該使用isNotNull的地方,缺使用了isNotEmpty
以上是從業(yè)務的角度來分析的,接下來,我們從技術角度來看一下這個問題。
isNotNull,顧名思義,就是不為null,也就是<>nullisNotEmpty,顧名思義就是不為空,也就是<>null,并且<>''(空字符串)
區(qū)別也很明顯,就是是否包含空字符串。針對上面的業(yè)務場景,我們需要保存空字符串,該什么哪個呢
看一下下面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#
當頁面?zhèn)鬟f過來的值為空字符串時,我們要保證能執(zhí)行對PRODUCT_NAME的修改,很顯然,需要使用isNotNull標簽。
出問題的原因其實也簡單,就是復制粘貼的代碼,也沒有注意到isNotNull與isNotEmpty的區(qū)別。
所以平時我們還是要細心,關鍵心中要有分寸,如果你很清楚的知道isNotNull與isNotEmpty的區(qū)別,一旦看到這個,你自然就會想到該如何使用。
isNull, isNotNull與isEmpty, isNotEmpty區(qū)別
關于這個看了很多例子都很模糊
- 在iBATIS中isNull用于判斷參數(shù)是否為Null,isNotNull相反
- isEmpty判斷參數(shù)是否為Null或者空,滿足其中一個條件則其true
- isNotEmpty相反,當參數(shù)既不為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,為空
如果有值,則更新成傳入的值
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Java的Spring框架下RMI與quartz的調(diào)用方法
這篇文章主要介紹了Java的Spring框架下RMI與quartz的調(diào)用方法,Spring是Java的SSH三大web開發(fā)框架之一,需要的朋友可以參考下2015-11-11
Java中ArrayList和LinkedList之間的區(qū)別_動力節(jié)點Java學院整理
這篇文章主要為大家詳細介紹了Java中ArrayList和LinkedList之間的區(qū)別,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-05-05
Java 實戰(zhàn)項目錘煉之網(wǎng)上商城系統(tǒng)的實現(xiàn)流程
讀萬卷書不如行萬里路,只學書上的理論是遠遠不夠的,只有在實戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用Java+jsp+servlet+mysql+ajax實現(xiàn)一個網(wǎng)上商城系統(tǒng),大家可以在過程中查缺補漏,提升水平2021-11-11
Java中Boolean與字符串或者數(shù)字1和0的轉換實例
下面小編就為大家?guī)硪黄狫ava中Boolean與字符串或者數(shù)字1和0的轉換實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-07-07
Java Springboot websocket使用案例詳解
這篇文章主要介紹了Java Springboot websocket使用案例詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下2021-09-09

