记一次多表数据关联操作解决过程

2019-07-24 18:31:33  卢浮宫  阅读量:110  版权声明:本文为站长原创文章,转载请写明出处


一、业务背景:有三张表(一主两从,使用主表ID进行外键关联)。现有一个前端页面,输入信息点击保存时同时把三条数据项写入数据库。


二、说一下解决思路进阶

    ①第一阶段:把三张表合并成一个实体类,在操作时拆分写入三张表     --> 数据耦合度太高,不利于数据安全,pass

    ②第二阶段:按顺序执行三个网络请求,写入从表数据时查询主表最后一个数据的ID      --> 虽然js是顺序执行,但是异步会导致先后写入不一致。多人操作时数据紊乱。

    ③第三阶段:使用存储过程,把参数统一传递过去然后,按照code和name查询对应ID    --> 依然存在数据写入不一致情况,操作步骤比较繁琐(虽然也写出来了

    ④第四阶段:在主表数据写入时返回新数据ID,最为下次操作的参数    --> 目前来说比较完美的解决方案


三、实现方式

    在mybatis的insert标签中 有一个这样的属性  useGenerateKeys = "true" keyColumn = "id"

    这个配置已经可以满足我们的操作需求了。

    大致代码如下:

    

<insert id="XXX" parameterType="com.hd.modules.sys.entity.XXX" useGeneratedKeys="true" keyColumn="id">
    insert into XXX () values ();
</insert>


四、属性解析

    mybatis在进行insert写入数据后检测到你使用了上述配置后就会调用jdbc的getGenerateKey()来获取新数据的主键然后使用反射给你的实体类属性进行赋值。

    mybatis部分代码如下:

protected void generateKeys(Object parameter) {
    KeyGenerator keyGenerator = mappedStatement.getKeyGenerator();
    ErrorContext.instance().store();
    keyGenerator.processBefore(executor, mappedStatement, null, parameter);
    ErrorContext.instance().recall();
  }
我们可以看到大致的运作方式:在使用了useGenerateKeys后会前置查询它的key数据(processBefore)然后进行的数据写入。
(上述是看过后的简单描述,可能不对,后面会有一个mybatis的整合分析,敬请期待)

最新评论:
2019年7月30日21:14:17 2019-07-31 05:16:40