Mybatis中isNotNull與isNotEmpty的使用心得
isNotNull與isNotEmpty使用心得
做開發(fā)工作時(shí)間長了,會(huì)發(fā)現(xiàn),在需求逐步梳理清晰以后,大致的方向已經(jīng)明確了。此時(shí)會(huì)進(jìn)入細(xì)節(jié)開發(fā)環(huán)節(jié),是最繁瑣,也是決定開發(fā)質(zhì)量的關(guān)鍵階段。最近遇到了一個(gè)生產(chǎn)問題,必填字段的值,清空保存,無法保存成功。
具體業(yè)務(wù)需求是這樣的
客戶的基本信息,坐席可以保存,也可以提交后端系統(tǒng)進(jìn)行審批。
1,保存的時(shí)候,其實(shí)就是一個(gè)暫存的功能,只要坐席輸入的是合法的值,都要保存入庫。
2,提交審批的時(shí)候會(huì)進(jìn)行各種校驗(yàn),包括合法性校驗(yàn)、必填校驗(yàn),業(yè)務(wù)邏輯校驗(yàn)等等。
生產(chǎn)問題就出在這個(gè)保存的功能上,如果一個(gè)字段有值,但是坐席清空,點(diǎn)保存,這時(shí)候保存沒有生效。
問題其實(shí)也很好定位,我去看了一下代碼就找到問題了。但是這個(gè)問題在生產(chǎn)上一直存在的。
主要是不是阻斷性問題,影響不大,所以可能有的坐席發(fā)現(xiàn)了,也沒有在意,沒有報(bào)生產(chǎn)問題。
原因就是:本該使用isNotNull的地方,缺使用了isNotEmpty
以上是從業(yè)務(wù)的角度來分析的,接下來,我們從技術(shù)角度來看一下這個(gè)問題。
isNotNull
,顧名思義,就是不為null,也就是<>nullisNotEmpty
,顧名思義就是不為空,也就是<>null,并且<>''(空字符串)
區(qū)別也很明顯,就是是否包含空字符串。針對(duì)上面的業(yè)務(wù)場(chǎng)景,我們需要保存空字符串,該什么哪個(gè)呢
看一下下面2個(gè)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#
當(dāng)頁面?zhèn)鬟f過來的值為空字符串時(shí),我們要保證能執(zhí)行對(duì)PRODUCT_NAME的修改,很顯然,需要使用isNotNull標(biāo)簽。
出問題的原因其實(shí)也簡單,就是復(fù)制粘貼的代碼,也沒有注意到isNotNull與isNotEmpty的區(qū)別。
所以平時(shí)我們還是要細(xì)心,關(guān)鍵心中要有分寸,如果你很清楚的知道isNotNull與isNotEmpty的區(qū)別,一旦看到這個(gè),你自然就會(huì)想到該如何使用。
isNull, isNotNull與isEmpty, isNotEmpty區(qū)別
關(guān)于這個(gè)看了很多例子都很模糊
- 在iBATIS中isNull用于判斷參數(shù)是否為Null,isNotNull相反
- isEmpty判斷參數(shù)是否為Null或者空,滿足其中一個(gè)條件則其true
- isNotEmpty相反,當(dāng)參數(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語句中不會(huì)更新這個(gè)字段
如果YBZHCODE傳入的是空 即:
hashMap.put("YBZHCODE",“”); ? ?
則sql語句 會(huì)將這個(gè)字段更新成null,為空
如果有值,則更新成傳入的值
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Redis中String字符串和sdshdr結(jié)構(gòu)體超詳細(xì)講解
這篇文章主要介紹了Redis中String字符串和sdshdr結(jié)構(gòu)體,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2023-04-04詳解 Java繼承關(guān)系下的構(gòu)造方法調(diào)用
這篇文章主要介紹了詳解 Java繼承關(guān)系下的構(gòu)造方法調(diào)用的相關(guān)資料,希望通過本文能幫助到大家,讓大家理解掌握這部分內(nèi)容,需要的朋友可以參考下2017-10-10idea中Maven鏡像源詳細(xì)配置步驟記錄(對(duì)所有項(xiàng)目)
Maven是一個(gè)能使我們的java程序開發(fā)節(jié)省時(shí)間和精力,是開發(fā)變得相對(duì)簡單,還能使開發(fā)規(guī)范化的工具,下面這篇文章主要給大家介紹了關(guān)于idea中Maven鏡像源詳細(xì)配置(對(duì)所有項(xiàng)目)的相關(guān)資料,需要的朋友可以參考下2023-05-05SpringBoot入門編寫第一個(gè)程序Helloworld
這篇文章是Springboot入門篇,來教大家編寫第一個(gè)Springboot程序Helloworld,文中附有詳細(xì)的示例代碼,有需要的同學(xué)可以借鑒參考下2021-09-09jmeter設(shè)置全局變量與正則表達(dá)式提取器過程圖解
這篇文章主要介紹了jmeter設(shè)置全局變量與正則表達(dá)式提取器過程圖解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-10-10java實(shí)現(xiàn)水仙花數(shù)的計(jì)算
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)水仙花數(shù)的計(jì)算,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-08-08Java并發(fā)Map面試線程安全數(shù)據(jù)結(jié)構(gòu)全面分析
本文將探討如何在Java中有效地應(yīng)對(duì)這些挑戰(zhàn),介紹一種強(qiáng)大的工具并發(fā)Map,它能夠幫助您管理多線程環(huán)境下的共享數(shù)據(jù),確保數(shù)據(jù)的一致性和高性能,深入了解Java中的并發(fā)Map實(shí)現(xiàn),包括ConcurrentHashMap和ConcurrentSkipListMap,及相關(guān)知識(shí)點(diǎn)2023-09-09Mybatis中注入執(zhí)行sql查詢、更新、新增及建表語句案例代碼
這篇文章主要介紹了Mybatis中注入執(zhí)行sql查詢、更新、新增以及建表語句,主要說明一個(gè)另類的操作,注入sql,并使用mybatis執(zhí)行,結(jié)合案例代碼詳解講解,需要的朋友可以參考下2023-02-02