MySQL数据库自增ID兼容手动设置

1 问题描述

  • 现有一个需要手动设置ID的需求,同时还能够兼容ID自增

  • 原有设计

    在这里插入图片描述

  • 原有插入代码

    在这里插入图片描述

  • 生成的SQL

    • INSERT INTO request_system ( channel_name) VALUES (?)
      
  • 以之前(上图)的设计来看,只能够满足ID自增,即使给待插入的实体类中设置ID字段,也无法采用设置的ID,还是会自增一个ID

2 快速解决

直接跳到结论即可

3 场景举例

  • 现有A表和B表
  • B表是A表的扩展表
  • B表可以单独新增数据
  • A表格在增加数据之后,需要同步该数据到B表,并且ID要保持一致

4 得出需求

  • 需要在ID设置为空的时候,自增ID
  • 需要在ID设置有值的时候,采用设置的这个值

5 源码流程

需要探究的问题:在BaseMapper调用insert方法后

  • SQL是怎么得到的
  • 参数参数值是怎么来的
  • 有哪些因素会影响将ID字段添加到SQL中

关键在最后的TableInfo表 5.9

5.1 MybatisPlusAutoConfiguration

在这里插入图片描述

在这里插入图片描述

5.2 MybatisSqlSessionFactoryBean

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

5.3 XMLMapperBuilder

在这里插入图片描述

在这里插入图片描述

5.4 MapperRegistry

在这里插入图片描述

5.5 MybatisMapperAnnotationBuilder

在这里插入图片描述

5.6 AbstractSqlInjector

在这里插入图片描述

5.7 AbstractMethod

在这里插入图片描述

5.8 Insert

在这里插入图片描述

  • sqlMethod决定了SQL模板
    在这里插入图片描述

  • columnScript是参数模板

  • columnScript是参数值模板

5.9 TableInfo

在这里插入图片描述

在这里插入图片描述

  • 这里决定了ID是否要加入到SQL

6 Type对插入ID造成的影响测试

6.1 Type.AUTO

在这里插入图片描述

在这里插入图片描述

测试结论:如果type类型为Type.AUTO,不会将主键ID增加到SQL的拼接中

6.2 Type.NONE

在这里插入图片描述

6.2.1 设置了ID

在这里插入图片描述

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

6.2.2 没设置ID

在这里插入图片描述

在这里插入图片描述

6.3 Type.INPUT

在这里插入图片描述

6.3.1 设置了ID

在这里插入图片描述

在这里插入图片描述

6.3.2 没设置ID

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

6.4 Type.ASSIGN_ID

会默认设置ID(根据雪花算法)

7 结论

7.1 解决方案1

  • 编写XXXMapper.xml,在xml中编写SQL语句进行ID插入
    在这里插入图片描述

  • 修改插入语句(改为调用mapper的方式去插入)

7.2 解决方案2(推荐)

  • 修改主键的ID类型为INPUT(仅适用于Mybatis-plus)
    在这里插入图片描述

8 参考资料

https://juejin.cn/post/6844904142658338829

9 最后

感谢大家看到这里,文章有不足,欢迎大家指出;如果你觉得写得不错,那就给我一个赞吧,欢迎大家关注和收藏转发文章!

  • 29
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五条Programmer

比心~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值