mybatis 批量insert 返回id,mybatis返回新增数据的id

  mybatis 批量insert 返回id,mybatis返回新增数据的id

  数据库ID生成策略是数据库表设计中不可缺少的领域。如何优雅地设计数据库ID以适应当前的业务场景,需要根据需要选择合适高效的策略。在复杂的分布式系统中,经常需要唯一地标识大量的数据和消息。介绍几种常见的身份生成策略。

  Sequence ID(数据库自增长)是数据库自增长序列或字段最常用的方法。由数据库维护,并且数据库表是唯一的。

  

优点

  简单、方便的编码和可接受的性能。数字排序自然,对于需要分页排序的结果有帮助。

缺点

  当数据库迁移或支持多个数据库版本时,数据库语法和实现需要处理。如果一个数据库是读写分离的,或者有多个主数据库,那么只能生成一个主数据库。单点故障的风险。如果性能达不到要求,规模相对较难。如果需要集成多个系统或者涉及数据迁移,会带来相当大的痛苦。分分钟图书馆有麻烦。唯一标识符(uuid)标准样式包含32个十六进制数字,用连字符分成五个部分。形状是8-4-4-4-12,一共36个字。

  保证MAC地址、时间戳、命名空间、随机数、伪随机数生成的ID的唯一性。

  

使用JAVA代码生成

  String uuid=UUID.randomUUID()。toString);system . err . println(uuid;//a 299 D6 ef-9f 82-475 e-B3 D5-F16 df 808 FEA 1 system . err . println(uuid . length);使用Mysql函数生成:

  uid(uuid)主要有五种算法。

  uuid1()).

  基于时间戳。由MAC地址、当前时间戳和随机数生成。虽然保证了在世界上的唯一性,但是MAC的使用也带来了安全问题。在局域网上可以用IP代替MAC。uuid2()).

  基于分布式计算环境DCE(Python中没有这个功能)。算法uuid1是相同的,只是时间戳的前四个位置被改为POSIX的uid。其实这种方法很少用。uuid3()).

  基于名称的MD5哈希值。计算名称和命名空间的MD5哈希值可以保证同一命名空间中不同名称和命名空间的唯一性,但是同一命名空间中相同的名称会生成相同的uuid。uuid4())

  基于随机数。从伪随机数来看,有一定的重复概率,可以计算出它的概率。uuid5()).

  基于名称的SHA-1哈希值。该算法与uuid3相同,只是使用了安全哈希算法1。

优点

  简单方便的代码。世界上唯一能从容应对数据迁移、系统数据集成或数据库变更的人。本地生成,不消耗网络资源。

  

缺点

:不好保存:UUID太长,16字节,128位。它通常由36长度的字符串表示,这在许多情况下并不适用。信息不安全——基于MAC地址生成UUID的算法可能导致MAC地址泄露。此漏洞已被用于查找Melissa病毒创建者的位置。MySQL明确建议主键尽量短[4],长度为36个字符的UUID不符合要求。MySQL索引的缺点:作为数据库主键使用时,在InnoDB引擎下,UUID的无序可能会频繁改变数据位置,严重影响性能。雪花算法是Twitter开源的分布式ID生成算法,结果是一个长整数ID。其核心思想是以41位为毫秒,10位为机器ID(5位为数据中心,5位为机器ID),12位为毫秒内的序列号),也就是说每个节点每毫秒可以生成4096个ID。)雪花算法可以根据自己的项目需要进行修改。比如,通过估算未来数据中心的数量,每个数据中心的计算机数量,以及积分毫秒内可能的并发行数,就可以调整算法所需的位数。

  //参数1是终端ID //参数2是数据中心idsnowlake=ID util . getsnowfake(1,1);long id=snow flake . nextid(;system . err . println(id;//13839690992935280643358 www.Sina.com/

  毫秒数处于高位,自增序列处于低位,整个ID呈现趋势性增长。独立于数据库等第三方系统,作为服务导入更稳定,ID生成性能也很高。可以根据自己的业务特点来分配比特,非常灵活。

优点

:高度依赖机器时钟。如果将时钟拨回机器,呼出号码将会重复,或者服务将不可用。开源ID生成器百度uid-生成器地址

  uid生成器由Java实现,是唯一基于雪花的id生成器。作为一个组件,允许用户覆盖工作Id位和初始化策略。因此适用于docker等虚拟化环境。而且我是通过消耗未来时间克服的。

  雪花算法的并发限制。使用RingBuffer缓存UID以并行化UID生成和使用;通过填充消除了来自环形缓冲区的缓存行的错误共享。最后,每个实例可以提供超过600万QPS。

  Didi Tinyid地址

  TinyID是一个ID生成器服务。它提供了一个REST API和一个获取ID的Java客户端。当使用Java客户端时,每个单个实例都有超过1000万个QPS。

  美团叶子地址

  Leaf参考了业界一些常见的ID生成方案,包括redis、UUID、snowflare等。以上每种方法都有自己的问题,所以我们决定实现一套分布式ID生成服务来满足需求。目前,Leaf负责美团点评公司的内部财务、餐饮、外卖、酒店旅游、猫眼电影等多项业务。在4c8VM的基础上,通过公司的RPC方法,QPS压力测试结果接近5w/s,TP999为1ms。

  MybatisPlus的ID生成器MybatisPlus提供了多种ID生成策略。

  类型ID生成IdType枚举类:

  public enum ID type {/* * * database ID autoincrement * p请确保数据库设置了auto increment,否则将无效。/p */auto (0),/* *这种类型是没有设置主键的类型(在注释中等于跟随全世界,global Rio等于输入)*/NONE(1),/* * *用户输入ID * p这种类型可以通过注册自动填充插件本身来填充。/p */INPUT(2),/*只有当插入的对象ID为空时,才会自动填充以下三种类型。*//* * *赋值ID(主键类型为数字或字符串),*默认实现类{ @ link com . baomi dou . mybatisplus . core . increment er . defaultidentifier generator }(雪花算法)* * @ sinc3.3.0 */assign _ id (3),/* * *赋值UUID(主键类型为字符串)*默认实现类{ @ link com . baomi dou . mybatisplus . core . increment er . defaultidentifier generator }(uuid . replace(-, )*/ASSIGN_UUID(私有final int键;id type(int key){ this . key=key;}}自动数据库ID自动递增。请确保数据库有ID自动递增,否则将无效。

  将数据库表ID设置为自动递增

  将实体类IdType设置为AUTO。

  @TableId(value=id ,type=IdType。AUTO)私有整数id;插入数据测试订单TBL订单TBL=新订单TBL();set money(100);set userid( 123 );setcommoditiycode( phone );ordertblmapper . insert(order TBL);

  type NONE是没有设置主键的类型(在注释中,等于跟随全局情况,全局Rio等于输入)。

  取消数据库表ID自动增量,并将实体类IdType设置为none @ tableID (value= ID ,type=idtype。none)私有整数ID;数据插入测试public void插入测试(){订单TBL订单TBL=新订单TBL()。setid (11111)。setmoney (100)。setuserid (123 )。setcommoditiycode( phone );ordertblmapper . insert(order TBL);}

  用户输入输入ID,这个类型可以通过注册自动填充插件本身来填充(经过测试,MetaObjectHandler不能自动填充主键ID,因为自动填充的时候,TableInfo字段信息被回收填充,但是TableInfo字段不包含主键,所以不能填充)。应该可以使用mybatis插件实现它(未经测试)。

  

方式一

:

  取消数据库表ID自动增量,并将实体类IdType设置为input @ tableID (value= ID ,type=idtype。输入)私有整数ID;数据插入测试与NONE step ASSIGN_ID赋值ID相同(主键类型为number或string),默认实现类为DefaultIdentifierGenerator(雪花算法)。

  

方式一使用默认生成器

:

  取消数据库表ID自动递增,并将实体类IdType设置为ASSIGN_ID,将字段类型设置为long @ tableid (value= id ,type=idtype。assign _ id)私有长id;数据插入测试同无步骤

方式二使用自定义ID生成器

:取消数据库表ID自动增量,将实体类IdType设置为ASSIGN_ID,字段类型设置为long @ tableid (value= id ,type=idtype。assign _ id)私有长id;添加自定义id生成器@组件公共类custom ID generator实现标识符生成器{ @ override public long nextid(object entity){//使用hutools雪花算法生成分布式ID //参数1是终端ID //参数2是数据中心ID雪花=idutil.getsnowfake (1,1);返回雪花. nextid();}}插入数据测试与无步骤相同。

mybatis 批量insert 返回id,mybatis返回新增数据的id