关于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,就可以更新成功。但是用实体传参时,无法实现功能。

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

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • pyspark.sql模块 模块上下文 Spark SQL和DataFrames的重要类: pyspark.sql...
    mpro阅读 13,222评论 0 13
  • 一. Java基础部分.................................................
    wy_sure阅读 9,297评论 0 11
  • 什么是数据库? 数据库是存储数据的集合的单独的应用程序。每个数据库具有一个或多个不同的API,用于创建,访问,管理...
    chen_000阅读 9,475评论 0 19
  • 1、MySQL启动和关闭(安装及配置请参照百度经验,这里不再记录。MySQL默认端口号:3306;默认数据类型格式...
    强壮de西兰花阅读 3,952评论 0 1
  • (故事一)那年冬天特别冷 那年冬天雪特别大,路上覆盖着厚厚的积雪,已经被踩得又硬又滑。他又没有来上课。 她走在正午...
    苔花也会绽放阅读 1,720评论 0 0

友情链接更多精彩内容