MyBatisPlus主键生成策略_梁云亮的博客-程序员秘密_mybatisplus主键生成策略

技术标签: 雪花算法  # MyBatis/MyBatisPlus  主键生成策略  ASSIGN_UUID  主键生成策略全局配置  ASSIGN_ID  

简介

我们可以通过 @TableId 注解的 type 属性来设置主键 id 的增长策略,一共有如下几种主键策略,可根据情况自由配置。
在这里插入图片描述
在这里插入图片描述

AUTO(数据库 ID 自增)

对于像 MySQL 这样的支持主键自动递增的数据库,我们可以使用 IdType.AUTO 策略。

@TableName("tb_user")
public class User {
    
    @TableId(type = IdType.AUTO)
    private Long id;
    private String name;
    private Integer age;
    private String email;
}

NONE(无状态)

如果使用 IdType.NONE 策略,表示未设置主键类型(注解里等于跟随全局,全局里约等于 INPUT)
INPUT(insert 前自行 set 主键值)

针对有序列的数据库:比如 Oracle,SQLServer 等,当需要建立一个自增字段时,需要用到 sequence。

  • 在 Oracle 11g 中,设置自增字段,需要先创建序列(SQUENCE),再创建一个触发器(TRIGGER)。
  • 在 Oracle 12c 中,只需要使用 IDENTITY 属性就可以了,和 MySQL 一样简单。

Mybatis-Plus 已经定义好了常见的数据库主键序列,我们首先只需要在 @Configuration 类中定义好 @Bean。Mybatis-Plus 内置了如下数据库主键序列(如果内置支持不满足你的需求,可实现 IKeyGenerator 接口来进行扩展):

  • DB2KeyGenerator
  • H2KeyGenerator
  • KingbaseKeyGenerator
  • OracleKeyGenerator
  • PostgreKeyGenerator
    示例:
@Bean
public OracleKeyGenerator oracleKeyGenerator(){
    
    return new OracleKeyGenerator();
}

然后实体类配置主键Sequence,指定主键策略为 IdType.INPUT 即可:
提示:支持父类定义 @KeySequence 子类使用,这样就可以几个表共用一个 Sequence

示例

@TableName("TEST_SEQUSER")
@KeySequence("SEQ_TEST")//类注解
public class TestSequser{
    
    @TableId(value = "ID", type = IdType.INPUT)
    private Long id;
}

如果主键是 String 类型的,也可以使用:
如何使用 Sequence 作为主键,但是实体主键类型是 String 也就是说,表的主键是 varchar2,但是需要从 sequence 中取值

  • 实体定义 @KeySequence 注解 clazz 指定类型 String.class
  • 实体定义主键的类型 String
    注意:oracle 的 sequence 返回的是 Long 类型,如果主键类型是 Integer,可能会引起 ClassCastException。
    示例:
@KeySequence(value = "SEQ_ORACLE_STRING_KEY", clazz = String.class)
public class User{
    
    @TableId(value = "ID_STR", type = IdType.INPUT)
    private String idStr;
    ...
}

ASSIGN_ID( ★★★★★)

如果不设置 type 值,默认则使用 IdType.ASSIGN_ID 策略(自 3.3.0 起)。该策略会使用雪花算法自动生成主键 ID,主键类型为 Long 或 String(分别对应 MySQL 的表字段为 BIGINT 和 VARCHAR)
提示:该策略使用接口 IdentifierGenerator 的方法 nextId(默认实现类为 DefaultIdentifierGenerator 雪花算法)。

雪花算法(SnowFlake)是 Twitter 开源的分布式 id 生成算法。其核心思想就是:使用一个 64 bit 的 long 型的数字作为全局唯一 id。在分布式系统中的应用十分广泛,且 ID 引入了时间戳,基本上保持自增的。
在这里插入图片描述
最高位不用,41bit保存时间戳,单位是毫秒,10bit的机器位,12bit的唯一序列号,可以理解是某一毫秒内,某台机器生成了不重复的序列号
10bit 一般一会分为5bit的datacenterId存储位和5bit的workerId存储位

示例

@Data
public class User {
    
    //指定主键生成策略使用雪花算法(默认策略)
    @TableId(type = IdType.ASSIGN_ID)
    private Long id;
    private String userName;
    private String passWord;
}

注意:

  • 类字段类型需要为Long
  • 数据库表字段类型为bigint

ASSIGN_UUID(不含中划线的UUID)

如果使用 IdType.ASSIGN_UUID 策略,则会自动生成不含中划线的 UUID 作为主键。主键类型为 String,对应 MySQL 的表字段为 VARCHAR(32)
提示:该策略使用接口 IdentifierGenerator 的方法 nextUUID

示例

@Data
public class User {
    
    //指定主键生成策略为不含中划线的UUID
    @TableId(type = IdType.ASSIGN_UUID)
    private String id;
    private String userName;
    private String passWord;
}

全局策略配置

假设我们希望默认全部都使用 AUTO 策略(数据库 ID 自增),那么可以在 application.properties 中添加如下配置进行修改:

mybatis-plus.global-config.db-config.id-type=auto
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/lianghecai52171314/article/details/120876136

智能推荐

Mybatis动态SQL中使用foreach标签遍历集合、字符串入参_无意的根本的博客-程序员秘密

如题,foreach就是迭代遍历,和你我在spring里面面对集合对象、数组对象写for系列遍历的时候作用一样;而在SQL中,foreach遍历通常用在in这个关键词后面。如果是mybatis动态SQL,那就在in关键字后面用的标签,既然是标签,那就有它这个标签内置所需要的参数,也就是foreach元素的属性,主要有item、index、collection、open、separator、clos...

都说html css 简单 为啥我觉得那么难_aiyaya730的博客-程序员秘密

眼高手低是自己多年来一贯的毛病,打算改掉这个毛病,从一些简单的事情做起。html ,css 写个静态网页,够简单了吧,我都折腾了2个晚上了,搞个自己想要的效果都费劲。被 css 茫茫多的属性弄的晕头转向,感觉这东西一点都不简单。有没有人有同感。。。

html单行文本两端对齐_HOOKTTG的博客-程序员秘密

昨晚,在群中看到有人问如何让单行文本的内容两端对齐?还发了张图片,原来他是想让很多input域的左侧标签文字能对齐。第一感觉就是不是有现成的CSS属性:text-align=justify;怎么还问?想想对方应该是不知道吧?就回复上面的属性,对方说不好使……难道有猫腻?处于学习进步,咱就测试看看吧。发现这些这一个属性确实不好使,效果和left一样……那就将文本内容填多些,就随便填了些1111111...

VUE根据token,路由判断用户登录状态并跳转登录页_vue3全局判断根据状态码跳转到登陆页_前端杨小白的博客-程序员秘密

router.beforeEach((to, from, next) => { var token = library.getData("userName"); //如果没登录,都导向登录页 if (!token) { if (to.path !== '/Login') { next({ path: '/Login' }) } else {...

JZOJ 3401 & JZOJ 5673. 【GDOI2018Day1模拟4.20】爬山法_Felix-Lee的博客-程序员秘密

JZOJ 5673. 【GDOI2018Day1模拟4.20】爬山法 DescriptionInput输入文件的第一行含有一个正整数 n,代表山的顶点数。 接下来 n 行,每行包含两个整数 x i 和 y i ,代表一个顶点的坐标。输入保证 x i单调递增。Output输出 n 行,第 i 行包含一个整数,代表从第 i 个顶点出发走到最高点需要经过多少段。Sample Input5 1 5 2 4 3 9

修linux内核信息,新闻|Linux 内核消息两则: 4.5 发布,历史最悠久的 LTS 内核 2.6.32 终止支持..._彩彩彩虹的博客-程序员秘密

最新的 Linux 内核 4.5 进入生产阶段2016/3/14 日,Linus Torvalds 和辛勤工作的内核团队宣布,Linux 内核 4.5 正式发布!从 1/25 发布第一个 RC 版本开始,在将近两个月的时间内发布了七个 RC 版本之后,Linux 内核 4.5 正式进入了最终的生产版本,而上一个 RC 版本发布于 3/6 日。“相比往常,在上周日发布要晚了一点,因为我一直犹豫是否发...

随便推点

读取hdfs目录下的gz文件内容_a1212563的博客-程序员秘密

读取hdfs指定目录下的gz文件,并读取gz文件里面的文本信息package com.bw.credit.hdfs;import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.File;import java.io.FileInputStream;im...

Django REST Framework登录界面使用postman模拟登录_tcliuwenwen的博客-程序员秘密

博文背景在测试带认证的接口时,使用token的我们容易解决,直接搞个api返回token即可,但是这种基于session的怎么搞个api获取session的值我目前还不清楚,所以需要模拟登录,但是在模拟登录时的登录表单提交中遇到了CSRF的麻烦。解决办法...

Python_字符编码问题,chardet,codecs_codecs chardet_menglei8625的博客-程序员秘密

1. chardet 插件可以方便的检测文件,URL,XML等等字符编码的类型。2. python中字符串的结构:python的全局函数中basestring,str和unicode的描述如下basestring() This abstract type is the superclass for str and unicode. It cannot be called

C++11之lambda表达式应用_weixin_30755709的博客-程序员秘密

应用foreach语句中#include <time.h>#include <algorithm>using namespace std;void func(int i){ cout<<i<<endl;} int main(int argc, char *argv[]){ li...

Linux环境下Springboot jar 启动方式_springboot jar 包 查看catalina.out_折古的博客-程序员秘密

Linux环境下Springboot jar 启动方式启动方式1:java -jar app.jar 前台启动启动方式2:nohup java -jar app.jar & 后台启动区别:前台启动ctrl+c就会关闭程序,后台启动ctrl+c不会关闭程序制定控制台的标准输出java -jar app.jar > catalina.out 2>&1 &am...

【hdoj_2100】Lovekey(大数+字符处理)_weixin_30699235的博客-程序员秘密

题目:http://acm.hdu.edu.cn/showproblem.php?pid=2100根据题目意思,现将字符串转化为10进制,再采用10进制加法相加,再转化为26进制.另一种直接的思路是:采用26进制,模拟加法过程.思路:用字符串存储两个26进制的数,然后在前面补A(相当于十进制中的0),使两个数对齐,以便进行加法进位.对齐之后,采用26进制,进行加...

推荐文章

热门文章

相关标签