2019-07-24 10:31:33 卢浮宫 版权声明:本文为站长原创文章,转载请写明出处
有三张表(一主两从,使用主表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的整合分析,敬请期待)