本文已参与「新人创作礼」活动,一起开启掘金创作之路。
前言
- 记录时间:2022.5.25
- 内容:
- 在Mapper中实现主键回填的方式。
- 其他我已知方式的弊端。
- 备注:
- 主键有很多方式可以实现主键回填。就像是想实现一个视频动画效果,可以通过不同软件甚至是同一软件的不同方式去实现(所谓掌握好前行方向和行走工具,即条条大路通罗马~
- 这里记录一下参考其他人的写法之后,我自己个人比较常用的一种。
1 实现代码
这里写了两种方法,取其一即可。
- 关键代码是
useGeneratedKeys="true" keyProperty="id" - 关键代码是
<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会耗时更久一些。