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

 更新时间:2022年1月15日 13:58  点击:935 作者:歪嘴战神-王德发

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):

  • AUTO(0, “数据库ID自增”),
  • INPUT(1, “用户输入ID”),
  • ID_WORKER(2, “全局唯一ID”),
  • UUID(3, “全局唯一ID”),
  • NONE(4, “该类型为未设置主键类型”),
  • ID_WORKER_STR(5, “字符串全局唯一ID”);

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

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

对于这种情况,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做主键将会添加到表上的其他索引中,因此会降低性能。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持猪先飞。

原文出处:https://blog.csdn.net/qq_35301793/article/details/102628756

[!--infotagslink--]

相关文章

  • C#连接SQL数据库和查询数据功能的操作技巧

    本文给大家分享C#连接SQL数据库和查询数据功能的操作技巧,本文通过图文并茂的形式给大家介绍的非常详细,需要的朋友参考下吧...2021-05-17
  • php简单数据操作的实例

    最基础的对数据的增加删除修改操作实例,菜鸟们收了吧...2013-09-26
  • 解决Mybatis 大数据量的批量insert问题

    这篇文章主要介绍了解决Mybatis 大数据量的批量insert问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-01-09
  • mybatis-plus 表名添加前缀的实现方法

    这篇文章主要介绍了mybatis-plus 表名添加前缀的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-08-26
  • Spring Cloud 中@FeignClient注解中的contextId属性详解

    这篇文章主要介绍了Spring Cloud 中@FeignClient注解中的contextId属性详解,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-09-25
  • Android子控件超出父控件的范围显示出来方法

    下面我们来看一篇关于Android子控件超出父控件的范围显示出来方法,希望这篇文章能够帮助到各位朋友,有碰到此问题的朋友可以进来看看哦。 <RelativeLayout xmlns:an...2016-10-02
  • Antd-vue Table组件添加Click事件,实现点击某行数据教程

    这篇文章主要介绍了Antd-vue Table组件添加Click事件,实现点击某行数据教程,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-11-17
  • mybatis-plus 返回部分字段的解决方式

    这篇文章主要介绍了mybatis-plus 返回部分字段的解决方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-10-02
  • 详解如何清理redis集群的所有数据

    这篇文章主要介绍了详解如何清理redis集群的所有数据,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-18
  • vue 获取到数据但却渲染不到页面上的解决方法

    这篇文章主要介绍了vue 获取到数据但却渲染不到页面上的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-11-19
  • MyBatis-Plus自动填充功能失效导致的原因及解决

    这篇文章主要介绍了MyBatis-Plus自动填充功能失效导致的原因及解决,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-02-04
  • mybatis-plus 处理大数据插入太慢的解决

    这篇文章主要介绍了mybatis-plus 处理大数据插入太慢的解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-12-18
  • php把读取xml 文档并转换成json数据代码

    在php中解析xml文档用专门的函数domdocument来处理,把json在php中也有相关的处理函数,我们要把数据xml 数据存到一个数据再用json_encode直接换成json数据就OK了。...2016-11-25
  • c# WPF中通过双击编辑DataGrid中Cell的示例(附源码)

    这篇文章主要介绍了c# WPF中通过双击编辑DataGrid中Cell的示例(附源码),帮助大家更好的理解和学习使用c#,感兴趣的朋友可以了解下...2021-03-03
  • Android开发中findViewById()函数用法与简化

    findViewById方法在android开发中是获取页面控件的值了,有没有发现我们一个页面控件多了会反复研究写findViewById呢,下面我们一起来看它的简化方法。 Android中Fin...2016-09-20
  • Android模拟器上模拟来电和短信配置

    如果我们的项目需要做来电及短信的功能,那么我们就得在Android模拟器开发这些功能,本来就来告诉我们如何在Android模拟器上模拟来电及来短信的功能。 在Android模拟...2016-09-20
  • postgresql数据添加两个字段联合唯一的操作

    这篇文章主要介绍了postgresql数据添加两个字段联合唯一的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-02-04
  • 夜神android模拟器设置代理的方法

    夜神android模拟器如何设置代理呢?对于这个问题其实操作起来是非常的简单,下面小编来为各位详细介绍夜神android模拟器设置代理的方法,希望例子能够帮助到各位。 app...2016-09-20
  • android自定义动态设置Button样式【很常用】

    为了增强android应用的用户体验,我们可以在一些Button按钮上自定义动态的设置一些样式,比如交互时改变字体、颜色、背景图等。 今天来看一个通过重写Button来动态实...2016-09-20
  • 解决mybatis-plus 查询耗时慢的问题

    这篇文章主要介绍了解决mybatis-plus 查询耗时慢的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-07-04