技术标签: 雪花算法 # MyBatis/MyBatisPlus 主键生成策略 ASSIGN_UUID 主键生成策略全局配置 ASSIGN_ID
我们可以通过 @TableId 注解的 type 属性来设置主键 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;
}
如果使用 IdType.NONE 策略,表示未设置主键类型(注解里等于跟随全局,全局里约等于 INPUT)
INPUT(insert 前自行 set 主键值)
针对有序列的数据库:比如 Oracle,SQLServer 等,当需要建立一个自增字段时,需要用到 sequence。
Mybatis-Plus 已经定义好了常见的数据库主键序列,我们首先只需要在 @Configuration 类中定义好 @Bean。Mybatis-Plus 内置了如下数据库主键序列(如果内置支持不满足你的需求,可实现 IKeyGenerator 接口来进行扩展):
@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(value = "SEQ_ORACLE_STRING_KEY", clazz = String.class)
public class User{
@TableId(value = "ID_STR", type = IdType.INPUT)
private String idStr;
...
}
如果不设置 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;
}
注意:
如果使用 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
如题,foreach就是迭代遍历,和你我在spring里面面对集合对象、数组对象写for系列遍历的时候作用一样;而在SQL中,foreach遍历通常用在in这个关键词后面。如果是mybatis动态SQL,那就在in关键字后面用的标签,既然是标签,那就有它这个标签内置所需要的参数,也就是foreach元素的属性,主要有item、index、collection、open、separator、clos...
眼高手低是自己多年来一贯的毛病,打算改掉这个毛病,从一些简单的事情做起。html ,css 写个静态网页,够简单了吧,我都折腾了2个晚上了,搞个自己想要的效果都费劲。被 css 茫茫多的属性弄的晕头转向,感觉这东西一点都不简单。有没有人有同感。。。
昨晚,在群中看到有人问如何让单行文本的内容两端对齐?还发了张图片,原来他是想让很多input域的左侧标签文字能对齐。第一感觉就是不是有现成的CSS属性:text-align=justify;怎么还问?想想对方应该是不知道吧?就回复上面的属性,对方说不好使……难道有猫腻?处于学习进步,咱就测试看看吧。发现这些这一个属性确实不好使,效果和left一样……那就将文本内容填多些,就随便填了些1111111...
router.beforeEach((to, from, next) => { var token = library.getData("userName"); //如果没登录,都导向登录页 if (!token) { if (to.path !== '/Login') { next({ path: '/Login' }) } else {...
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 内核 4.5 进入生产阶段2016/3/14 日,Linus Torvalds 和辛勤工作的内核团队宣布,Linux 内核 4.5 正式发布!从 1/25 发布第一个 RC 版本开始,在将近两个月的时间内发布了七个 RC 版本之后,Linux 内核 4.5 正式进入了最终的生产版本,而上一个 RC 版本发布于 3/6 日。“相比往常,在上周日发布要晚了一点,因为我一直犹豫是否发...
读取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...
博文背景在测试带认证的接口时,使用token的我们容易解决,直接搞个api返回token即可,但是这种基于session的怎么搞个api获取session的值我目前还不清楚,所以需要模拟登录,但是在模拟登录时的登录表单提交中遇到了CSRF的麻烦。解决办法...
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
应用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 启动方式启动方式1:java -jar app.jar 前台启动启动方式2:nohup java -jar app.jar & 后台启动区别:前台启动ctrl+c就会关闭程序,后台启动ctrl+c不会关闭程序制定控制台的标准输出java -jar app.jar > catalina.out 2>&1 &am...
题目:http://acm.hdu.edu.cn/showproblem.php?pid=2100根据题目意思,现将字符串转化为10进制,再采用10进制加法相加,再转化为26进制.另一种直接的思路是:采用26进制,模拟加法过程.思路:用字符串存储两个26进制的数,然后在前面补A(相当于十进制中的0),使两个数对齐,以便进行加法进位.对齐之后,采用26进制,进行加...