关于MyBatis进行更新操作前判空带来的问题(实际问题解决)

在使用SSM技术进行开发时,XML文件中经常会这么写update语句:

<update id="updateStudent" parameterType="StudentEntity">

    UPDATE STUDENT_TBL

    <set>

        <if test="name!= null name != ''">

            name = #{name},

        if>

        <if test="age != null and age != ''">

            age = #{age},

        if>

    set>

    id = #{id};

update>

这么写的好处是增强代码的复用性,不用在每个需要更新的地方(更新不同字段)都写一个update语句,这也就是动态sql的好处吧。

但是在实际开发中(本人小白一枚)遇到一个问题,前端有非必填的字段,如果在用户修改信息前,这个字段是有值的,但是用户恰恰是想把这个值去掉,那么传入后端的值就是null或者“”(空字符串)——如果后台接收参数的数据类型是String,那接收到的是空字符串,但是如果接收参数的数据类型是Integer这样的类型,接收到的参数就是null。这时候在动态sql中update前先进行空值判断就没法达到预期效果了,从有值到无值的更新无法完成。

通过自己的思考和参考前人意见,得到以下几种解决方式:

1. 特殊的地方写特殊sql,但是这种方式应该不太可取,这样代码会显得太不够灵活了以及冗余;

2. 每次更新操作前,先从数据库查出原来的数据,需要更改的字段再重新赋值,然后再进行全字段的更新操作(不需判空),这样的话可能会性能稍微低一点;

3. 业务层判断前端参数是否为空,如果为空的话就赋一个特殊的值(比如-1这种)进行替换,这样的话当前端传的是空值时也能更新成功,但个人觉得让人理解起来比较困难,而且如果需要记录修改操作时,也会不太准确;

4. 使用map进行参数传递,然后这么写:

<update id="updateStudent" parameterType="StudentEntity">

    UPDATE STUDENT_TBL

    <set>

        <if test = "_parameter.containsKey('name')">

            'name' = #{'name'},

        if>

        <if test = "_parameter.containsKey(age)">

            age= #{age},

        if>

    set>

    id = #{id};

update>

这样即使新的参数为null,只要map中有这个key,就可以更新成功。但是用实体传参时,无法实现功能。

以上方法各有利弊,目前我还没有找到最优解,希望有大佬可以指点迷津~

你可能感兴趣的:(关于MyBatis进行更新操作前判空带来的问题(实际问题解决))