文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

mybatis-plus添加数据时id自增问题及解决

2024-04-02 19:55

关注

mybatis-plus添加数据时id自增问题

mybatis-plus插入数据,id自增列变的很长.比如下图:

在这里插入图片描述

mybatis-plus中遇到一个,添加数据到数据库,而数据库中的id列是自增列

使用plus中自带的insert方法添加到数据库,id自增变的很长很长,

数据库id字段数据类型为long

解决方案

在实体类自增的id字段添加一个注解

在这里插入图片描述

mybatis plus在插入记录时,有以下几种方法:

boolean insert(T var1);
boolean insertAllColumn(T var1);
boolean insertBatch(List var1);
boolean insertBatch(List var1, int var2);
boolean insertOrUpdateBatch(List var1);
boolean insertOrUpdateBatch(List var1, int var2);

当时实体中,主键生成方式不设置生成方式时,默认的是自增。所有当你设置主键的值时,依旧无法保存主键。

@TableId(value = “id”)
private Integer id;

我们可以设置主键的生成方式

@TableId(value = “id”,type = IdType.INPUT) 这种方式是主键手动输入

主键生成方式类型如下(IdType):

插入记录的主键自增赋值机制说明

现在的项目实践中,表设计一般采用自增主键,那么在这当中会涉及到数据插入后,获取插入数据主键的一个场景处理。

对于这种情况,mybatis框架做了封装,提供了支持。

代码说明

通过debug方式,跟进执行路径,查看对应逻辑代码。

1、找到执行入口

在这里插入图片描述

这里的参数赋值有三个,但不包括id的赋值,id是由数据库自增。

这里看到一个KeyGenerator的类型,这个名字name的很好,自说明性很好。

2、看看keyGenerator的执行逻辑

在这里插入图片描述

这里可以看出,参数类型的id依然是空,但是上图的sql执行已结束。

3、 跟进逻辑执行

在这里插入图片描述

这是一部分逻辑,还没有到,但是看方法名assign,就要到了。

4、继续进入下一层逻辑

在这里插入图片描述

这个时候,id仍然是null

5、继续进入下一层逻辑

在这里插入图片描述

这里我们看到有set的动作,在执行前,id是仍然为null

6、关键取值

在这里插入图片描述

在Object value 的赋值逻辑,看到数据是从rs中获取,值是184

7、关键赋值

在这里插入图片描述

在这里插入图片描述

在执行完set后,插入数据的类型对象的id有了值。

到这里自增id赋值就结束了。

总结

自增id的补偿赋值很好的弥补了同自定义id的不足。但是为什么框架能做到呢。看下面的注释说明

在这里插入图片描述

这是JDBC的标准接口,提供了这个口子,在sql执行返回后,可以带上自增id的信息,因此应用层框架可以执行赋值,避免二次查询。

实际项目是采用自增主键,还是自定义赋值主键,需要充分考虑到两者的优缺点同实际的情况结合。优缺点可以参考如下:

这种方式是使用数据库提供的自增数值型字段作为自增主键,它的优点是:

自增主键

这种方式是使用数据库提供的自增数值型字段作为自增主键,

优点是:

1、数据库自动编号,速度快,而且是增量增长,按顺序存放,对于检索非常有利;

2、数字型,占用空间小,易排序,在程序中传递也方便;

3、如果通过非系统增加记录时,可以不用指定该字段,不用担心主键重复问题。

缺点 :

1、因为自动增长,在手动要插入指定ID的记录时会显得麻烦,尤其是当系统与其它系统集成时,需要数据导入时,很难保证原系统的ID不发生主键冲突(前提是老系统也是数字型的)。

2、如果经常有合并表的操作,就可能会出现主键重复的情况很难处理分布式存储的数据表。

3、数据量特别大时,会导致查询数据库操作变慢。此时需要进行数据库的水平拆分,划分到不同的数据库中,那么当添加数据时,每个表都会自增长,导致主键冲突。

UUID

优点:

1、能够保证独立性,程序可以在不同的数据库间迁移,效果不受影响。保证生成的ID不仅是表独立的,而且是库独立的,这点在你想切分数据库的时候尤为重要。

缺点:

1、比较占地方,和INT类型相比,存储一个UUID要花费更多的空间。

2、使用UUID后,URL显得冗长,不够友好。

3、Join操作性能比int要低。

4、UUID做主键将会添加到表上的其他索引中,因此会降低性能。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯