RuoYi | Mapper实现主键回填

476 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

前言

  • 记录时间:2022.5.25
  • 内容:
    • 在Mapper中实现主键回填的方式。
    • 其他我已知方式的弊端。
  • 备注:
    • 主键有很多方式可以实现主键回填。就像是想实现一个视频动画效果,可以通过不同软件甚至是同一软件的不同方式去实现(所谓掌握好前行方向和行走工具,即条条大路通罗马~
    • 这里记录一下参考其他人的写法之后,我自己个人比较常用的一种。

1 实现代码

这里写了两种方法,取其一即可。

  1. 关键代码是useGeneratedKeys="true" keyProperty="id"
  2. 关键代码是<selectKey></selectKey>
<insert id="addPxCourseClass" parameterType="PxCourseClass" useGeneratedKeys="true" keyProperty="id">
    <!--通过mybatis框架提供的selectKey标签获得自增产生的ID值-->
    <selectKey keyProperty="id" resultType="java.lang.Long" order="AFTER">
        SELECT LAST_INSERT_ID()
    </selectKey>
    insert into ...
</insert>

这里实现的是在新增完这条数据之后,原本的对象即有了id。

可以理解成:进行了这一条insert操作,查询的参数对象同时被迫进行了一条把id填入自己的操作。

2 应用场景

  • 对数据库的数据进行新增的操作时,默认返回的是新增操作的结果,0是失败1是成功。

  • 但我们往往需要在新增一个对象数据之后,对新增后的这个数据进行操作。

  • 如何定位到这个新增的数据对象呢?那除了通过已知属性数据去再次查询出这个对象之外,也就是通过id去定位,这时候就需要用到主键回填了。

3 其他方法

① Controller

  • 正如应用场景里所说的通过已知属性数据去再次查询出这个对象。
    PxCourseClass pxClass = new PxCourseClass();
    pxClass.setName("体育课");
    PxCourseClass res = pxCourseClassService.selectCourseClass(pxClass);
  • 可以单独写一个方法,也可以调用查询结果为数组对象的方法,然后取得第0个值。
    PxCourseClass pxClass = new PxCourseClass();
    pxClass.setName("体育课");
    List<PxCourseClass> pxClassList = pxCourseClassService.selectCourseClassList(pxClass);
    PxCourseClass res = pxClassList.get(0);

② ServiceImpl

  • 直接单独写一个通过已知属性数据取查询出一个对象的方法。(上同)

  • 也可以在serviceImpl里查询时调用查询结果为数组对象的方法,然后取得第0个值。(上同)

  • 弊端: 单独写一个方法,意味着Mapper里需要新增一个和selectList除了返回参数之外,几乎一模一样的方法模块,就有些冗余了。

  • 弊端: 如果通过已知属性数据无法查到结果,那么null值是无法get(0)得到第0个对象的,所以需要再加一个是否为null的判断,如果是则人工去返回一个0。这时候如果项目比较大,而返回的报错只是告知失败,就有些难知道出错点在哪,debug会耗时更久一些。