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

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

作者: 念念_16 | 来源:发表于2020-03-18 19:11 被阅读0次

    在使用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进行更新操作前判空带来的问题(实际问题解决)

          本文链接:https://www.haomeiwen.com/subject/ldmcyhtx.html