好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

Mybatis中isNotNull与isNotEmpty的使用心得

isNotNull与isNotEmpty使用心得

做开发工作时间长了,会发现,在需求逐步梳理清晰以后,大致的方向已经明确了。此时会进入细节开发环节,是最繁琐,也是决定开发质量的关键阶段。最近遇到了一个生产问题,必填字段的值,清空保存,无法保存成功。

具体业务需求是这样的

客户的基本信息,坐席可以保存,也可以提交后端系统进行审批。

1,保存的时候,其实就是一个暂存的功能,只要坐席输入的是合法的值,都要保存入库。

2,提交审批的时候会进行各种校验,包括合法性校验、必填校验,业务逻辑校验等等。

生产问题就出在这个保存的功能上,如果一个字段有值,但是坐席清空,点保存,这时候保存没有生效。

问题其实也很好定位,我去看了一下代码就找到问题了。但是这个问题在生产上一直存在的。

主要是不是阻断性问题,影响不大,所以可能有的坐席发现了,也没有在意,没有报生产问题。

原因就是:本该使用isNotNull的地方,缺使用了isNotEmpty

以上是从业务的角度来分析的,接下来,我们从技术角度来看一下这个问题。

isNotNull ,顾名思义,就是不为null,也就是<>null isNotEmpty ,顾名思义就是不为空,也就是<>null,并且<>''(空字符串)

区别也很明显,就是是否包含空字符串。针对上面的业务场景,我们需要保存空字符串,该什么哪个呢

看一下下面2个SQL语句

?

1

2

3

4

5

6

7

8

9

UPDATE

    PRODUCT P

SET

    UPDATE_TIME = SYSDATE

    <isNotEmpty prepend= "AND" property= "productName" >

        P.PRODUCT_NAME = #productName#

    </isNotEmpty>

WHERE

    P.PRODUCT_ID = #productId#

?

1

2

3

4

5

6

7

8

9

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

例子

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

   < 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 即:

?

1

hashMap.put( "YBZHCODE" , null );    

则sql语句中不会更新这个字段

如果YBZHCODE传入的是空 即:

?

1

hashMap.put( "YBZHCODE" ,[]);    

则sql语句 会将这个字段更新成null,为空

如果有值,则更新成传入的值

以上为个人经验,希望能给大家一个参考,也希望大家多多支持。

原文链接:https://blog.csdn.net/reggergdsg/article/details/81603830

查看更多关于Mybatis中isNotNull与isNotEmpty的使用心得的详细内容...

  阅读:42次