mybatis-plus主键生成策略

MP 支持多种主键策略 默认是推特的“” 雪花算法“” ,也可以设置其他策略下面我演示主键策略使用

MP的主键定义在一个一个枚举类中 源码如下

public enum IdType {
  AUTO(0),//数据库自增 依赖数据库
  NONE(1),// 表示该类型未甚至主键类型 (如果没有主键策略)默认根据雪花算法生成
  INPUT(2),//用户输入ID(该类型可以通过自己注册填充插件进行填充)
  //下面这三种类型,只有当插入对象id为空时 才会自动填充。
  ID_WORKER(3),//全局唯一(idWorker)数值类型
  UUID(4),//全局唯一(UUID)
  ID_WORKER_STR(5);//全局唯一(idWorker的字符串表示)

  private final int key;

  private IdType(int key) {
    this.key = key;
  }

  public int getKey() {
    return this.key;
  }
}

1,局部主键策略实现

在实体类中 ID属性加注解

@TableId(type = IdType.AUTO) 主键自增 数据库中需要设置主键自增
private Long id;
@TableId(type = IdType.NONE) 默认 跟随全局策略走
private Long id;
@TableId(type = IdType.UUID) UUID类型主键
private Long id;
@TableId(type = IdType.ID_WORKER) 数值类型 数据库中也必须是数值类型 否则会报错
private Long id;
@TableId(type = IdType.ID_WORKER_STR) 字符串类型  数据库也要保证一样字符类型
private Long id;
@TableId(type = IdType.INPUT) 用户自定义了 数据类型和数据库保持一致就行
private Long id;

2,全局主键策略实现

需要在application.yml文件中

添加

mybatis-plus:
 mapper-locations:
  - com/mp/mapper/*
 global-config:
  db-config:
   id-type: uuid/none/input/id_worker/id_worker_str/auto  表示全局主键都采用该策略(如果全局策略和局部策略都有设置,局部策略优先级高)

  Mybatis-Plus中另外的几种主键生成策略

 1、分布式系统中主键的生成策略

​ 在分布式系统中,常见的主键生成策略有以下几种:

1.1 数据库自增长序列或字段

​ 最常见的方式。利用数据库,全数据库唯一。

​ 优点:

​ 1)简单,代码方便,性能可以接受。

​ 2)数字ID天然排序,对分页或者需要排序的结果很有帮助。

​ 缺点:

​ 1)不同数据库语法和实现不同,数据库迁移的时候或多数据库版本支持的时候需要处理。

​ 2)在单个数据库或读写分离或一主多从的情况下,只有一个主库可以生成。有单点故障的风险。

​ 3)在性能达不到要求的情况下,比较难于扩展。

​ 4)如果遇见多个系统需要合并或者涉及到数据迁移会相当痛苦。

​ 5)分表分库的时候会有麻烦。

​ 优化方案:

​ 针对主库单点,如果有多个Master库,则每个Master库设置的起始数字不一样,步长一样,可以是Master的个数。比如:Master1 生成的是 1,4,7,10,Master2生成的是2,5,8,11 Master3生成的是 3,6,9,12。这样就可以有效生成集群中的唯一ID,也可以大大降低ID生成数据库操作的负载。类似于Redis的生成策略

1.2 UUID

​ 常见的方式。可以利用数据库也可以利用程序生成,一般来说全球唯一。

​ 优点:

​ 1)简单,代码方便。

​ 2)生成ID性能非常好,基本不会有性能问题。

​ 3)全球唯一,在遇见数据迁移,系统数据合并,或者数据库变更等情况下,可以从容应对。

缺点:

​ 1)没有排序,无法保证趋势递增。

​ 2)UUID往往是使用字符串存储,查询的效率比较低。

​ 3)存储空间比较大,如果是海量数据库,就需要考虑存储量的问题。

​ 4)传输数据量大

​ 5)可读性差

1.3 UUID to Int64

​ UUID的变种:解决了UUID可读性差和无序的问题

1.4 Redis生成ID

​ 当使用数据库来生成ID性能不够要求的时候,我们可以尝试使用Redis来生成ID。这主要依赖于Redis是单线程的,所以也可以用生成全局唯一的ID。可以用Redis的原子操作 INCR和INCRBY来实现。

​ 可以使用Redis集群来获取更高的吞吐量。假如一个集群中有5台Redis。可以初始化每台Redis的值分别是1,2,3,4,5,然后步长都是5。各个Redis生成的ID为:

​ A:1,6,11,16,21

​ B:2,7,12,17,22

​ C:3,8,13,18,23

​ D:4,9,14,19,24

​ E:5,10,15,20,25

​ 这个,随便负载到哪个机确定好,未来很难做修改。但是3-5台服务器基本能够满足器上,都可以获得不同的ID。但是步长和初始值一定需要事先需要了。使用Redis集群也可以方式单点故障的问题。

​ 另外,比较适合使用Redis来生成每天从0开始的流水号。比如订单号=日期+当日自增长号。可以每天在Redis中生成一个Key,使用INCR进行累加。

​ 优点:

​ 1)不依赖于数据库,灵活方便,且性能优于数据库。

​ 2)数字ID天然排序,对分页或者需要排序的结果很有帮助。

​ 缺点:

​ 1)如果系统中没有Redis,还需要引入新的组件,增加系统复杂度。

​ 2)需要编码和配置的工作量比较大。

1.5 Twitter的snowflake算法 (雪花算法)

​ snowflake是Twitter开源的分布式ID生成算法,结果是一个long型的ID。其核心思想是:使用41bit作为毫秒数,10bit作为机器的ID(5个bit是数据中心,5个bit的机器ID),12bit作为毫秒内的流水号(意味着每个节点在每毫秒可以产生 4096 个 ID),最后还有一个符号位,永远是0。具体实现的代码可以参看https://github.com/twitter/snowflake

​ snowflake算法可以根据自身项目的需要进行一定的修改。比如估算未来的数据中心个数,每个数据中心的机器数以及统一毫秒可以能的并发数来调整在算法中所需要的bit数。

​ 优点:

​ 1)不依赖于数据库,灵活方便,且性能优于数据库。

​ 2)ID按照时间在单机上是递增的。

​ 缺点:

​ 1)在单机上是递增的,但是由于涉及到分布式环境,每台机器上的时钟不可能完全同步,也许有时候也会出现不是全局递增的情况。

​ MP中的ID_WORKER就是使用的这种算法

1.6 zookeeper生成唯一ID

​ zookeeper主要通过其znode数据版本来生成序列号,可以生成32位和64位的数据版本号,客户端可以使用这个版本号来作为唯一的序列号。
​ 很少会使用zookeeper来生成唯一ID。主要是由于需要依赖zookeeper,并且是多步调用API,如果在竞争较大的情况下,需要考虑使用分布式锁。因此,性能在高并发的分布式环境下,也不甚理想。

1.7 MongoDB的ObjectId

​ MongoDB的ObjectId和snowflake算法类似。它设计成轻量型的,不同的机器都能用全局唯一的同种方法方便地生成它。MongoDB 从一开始就设计用来作为分布式数据库,处理多个节点是一个核心要求。使其在分片环境中要容易生成得多。

到此这篇关于mybatis-plus主键生成策略的文章就介绍到这了,更多相关mybatis-plus 主键内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • mybatis-plus实体类主键策略有3种(小结)

    mybatis plus 实体类主键策略有3种( 注解 > 全局 > 默认 ) 当IdType的类型为ID_WORKER.ID_WORKER_STR或者UUID时,主键由MyBatis Plus的IdWorker类生成,idWorker中调用了分布式唯一 ID 生成器 - Sequence 1.注解方式 @TableId(type = IdType.AUTO)在实体类增加注解即可 @TableName("t_article") public class TArticle e

  • 浅谈MyBatis Plus主键设置策略

    根据一次插入失败报错来了解下MyBatis Plus主键设置策略今天学习使用MyBatis Plus,发现使用代码生成器生成对应的实体类.Service和Mapper后,在保存数据时报错 com.baomidou.mybatisplus.exceptions.MybatisPlusException: java.lang.reflect.InvocationTargetException at com.baomidou.mybatisplus.MybatisSqlSessionTemplate$

  • Java探索之Hibernate主键生成策略详细介绍

    1.increment 由Hibernate从数据库中去除主键的最大值(每个session只取一次),以该值为基础,每次增量为1,在内存中生成主键,不依赖于底层的数据库,因此可以跨数据库. <id name="id" column="id"> <generator class="increment" /> </id> Hibernate调用org.hibernate.id.IncrementGenerator类

  • mybatis-plus主键生成策略

    MP 支持多种主键策略 默认是推特的"" 雪花算法"" ,也可以设置其他策略下面我演示主键策略使用 MP的主键定义在一个一个枚举类中 源码如下 public enum IdType { AUTO(0),//数据库自增 依赖数据库 NONE(1),// 表示该类型未甚至主键类型 (如果没有主键策略)默认根据雪花算法生成 INPUT(2),//用户输入ID(该类型可以通过自己注册填充插件进行填充) //下面这三种类型,只有当插入对象id为空时 才会自动填充. ID_WO

  • Mybatisplus主键生成策略算法解析

    mybatisplus支持多种主键生成策略,默认采用认 ID_WORKER 即雪花算法 雪花算法 snowflflake是Twitter开源的分布式ID生成算法,结果是一个long型的ID.其核心思想是:使用41bit作为毫秒数,10bit作为机器的ID(5个bit是数据中心,5个bit的机器ID),12bit作为毫秒内的流水号(意味着每个节点在每毫秒可以产生 4096 个 ID),最后还有一个符号位,永远是0.可以保证几乎全球唯一! mybatisplus默认主键生成策略有可能会和我们的数据库

  • Mybatis-Plus主键生成策略的方法

    目录 前言 一.官网 二.主键注解@TableId说明 1.源码 2.作用 3.使用 三.主键生成策略-IdType枚举说明 1.源码 2.说明 3.全局设置 三.ID生成器介绍 1.IdentifierGenerator 2.IKeyGenerator 四.自定义主键生成器 总结 前言 很多人在使用Mybatis-Plus的时候可能会疑惑,自己明明没有配置主键的生成策略,但是执行新增操作时却自动生成了主键,而且还特别长.这是由于Mybatis-Plus默认就会采用雪花算法填充主键字段. 今天就

  • tk.mybatis实现uuid主键生成的示例代码

    引入依赖 <dependency> <groupId>tk.mybatis</groupId> <artifactId>mapper-spring-boot-starter</artifactId> <version>2.0.2</version> </dependency> 1.创建一个GenId的实现类 package com.xiaobu.base.entity; import tk.mybatis.ma

  • 详解MyBatis中主键回填的两种实现方式

    主键回填其实是一个非常常见的需求,特别是在数据添加的过程中,我们经常需要添加完数据之后,需要获取刚刚添加的数据 id,无论是 Jdbc 还是各种各样的数据库框架都对此提供了相关的支持,本文我就来和和大家分享下数据库主键回填在 MyBatis 中的两种实现思路. 原生写法 框架来源于我们学过的基础知识,主键回填实际上是一个在 JDBC 中就被支持的写法,有的小伙伴可能不知道这一点,因此这里我先来说说在 JDBC 中如何实现主键回填. JDBC 中实现主键回填其实非常容易,主要是在构造 Prepar

  • mybatis-plus id主键生成的坑

    简要说明 由于mybatis-plus会自动插入一个id到实体对象, 不管你封装与否, 所以有时候导致一些意外的情况发生 默认是生成一个长数字字符串(编码不同可能结尾带有字母) 错误 ested exception is org.apache.ibatis.reflection.ReflectionException: Could not set property 'id' of 'class com.xxx' with value '1110423703487479810' Cause: ja

  • MySQL的主键命名策略相关

    最近在梳理数据生命周期管理的细节时,发现了一个小问题,那就是MySQL的主键命名策略,似乎会忽略任何形式的自定义命名. 也就意味着你给主键命名为idx_pk_id这种形式,在MySQL里面会统一按照PRIMARY来处理. 当然我们可以在这个基础之上做一些拓展和补充. 首先来复现下问题,我们连接到数据库test,然后创建表test_data2. mysql> use test mysql> create table test_data2 (id int ,name varchar(30)); Q

  • Mybatis-Plus默认主键策略导致自动生成19位长度主键id的坑

    某天检查一位离职同事写的代码,发现其对应表虽然设置了AUTO_INCREMENT自增,但页面新增功能生成的数据主键id很诡异,长度达到了19位,且不是从1开始递增的-- 我检查了一下,发现该表目前自增主键已经变成从1468844351843872770开始递增了-- 这就很奇怪了,目前该表数据量很少,且主键是设置AUTO_INCREMENT,正常而言,应该自增id仍在1000范围内,但目前已经变成一串长数字. 底层ORM框架用的是Mybatis-Plus,我寻思了一下,这看起来像是在插入数据库就

随机推荐