MyBatis-Plus 主键生成策略_mybatisplus自定义主键策略_Training.L的博客-程序员秘密

技术标签: mybatis  

MyBatis-Plus 主键生成策略

接上一篇博客:快速上手 MyBatis-Plus 开发

在测试类中执行 Insert 操作,向数据表中插入记录:

//测试插入操作
@Test
public void testInsert(){
    
    User user = new User();
    user.setName("Cloud");
    user.setAge(3);
    user.setEmail("[email protected]"); //MP自动生成id
    int res = userMapper.insert(user);
    System.out.println(res);  //受影响的行数
    System.out.println(user);
}

通过控制台打印的日志发现,MyBatis-Plus 自动为 user 对象的 id 属性赋值,赋值采用的是雪花算法;

@TableId:设置主键映射,value 映射主键字段名,type 设置主键类型,即主键的生成策略。比如:@TableId(value = "id", type = IdType.AUTO)

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor

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

IdType 是枚举类,主要有 4 种不同类型的取值(AUTO、NONE、INPUT、ASSIGN_ID 和 ASSIGN_UUID),源码如下:

public enum IdType {
    
    AUTO(0),
    NONE(1),
    INPUT(2),
    ASSIGN_ID(3),
    ASSIGN_UUID(4),
    
    //下面的表示已经弃用了,并以上面几种代替
    /** @deprecated */
    @Deprecated
    ID_WORKER(3),
    /** @deprecated */
    @Deprecated
    ID_WORKER_STR(3),
    /** @deprecated */
    @Deprecated
    UUID(4);
}
描述
AUTO 主键字段自增
NONE 未设置主键
INPUT 需要开发者手动赋值
ASSIGN_ID MP 分配 ID,Number / String 类型
ASSIGN_UUID MP 分配 UUIN,String 类型

1、AUTO:主键字段自增

① 实体类的主键字段的注解 @TableId(type = IdType.AUTO)

② 数据表对应的字段一定也要设置成自增;

如果只加了注解,但没有将数据表对应的主键字段设置为自增,则将会出现如下的异常!

注意:使用 type = IdType.AUTO 注解时,一定要将其对应的主键字段设置为【自增】。

2、NONE:未设置主键

由于每一张数据表都是有主键的,因此几乎没有添加该注解的必要。

3、INPUT:需要开发者手动赋值

INPUT 如果开发者没有手动赋值,则数据库通过设置自增方式给主键赋值(MP不介入主键生成),同样地,如果数据库也没有设置自增则会抛出异常;如果开发者手动赋值,则直接存入该值。

可以看到 user 对象的主键 id 值为 null,但该对象被成功插入到数据库中,是因为数据库设置了主键自增的策略。

牢记一点:@TableId=(type = IdType.INPUT ) 注解下 MyBatis-Plus 不介入主键生成。

4、ASSIGN_ID:MyBatis-Plus 自动赋值

ASSIGN_ID 如果用户或开发者没有为主键赋值,则由 MyBatis-Plus 采用 snowflake 算法(也被称为雪花算法)为主键字段分配一个ID,这个 ID 可以是 Number(Long) 类型,也可以是 String 类型。

雪花算法:snowflake是Twitter开源的分布式ID生成算法,结果是一个long型的ID。其核心思想是:使用41bit作为 毫秒数,10bit作为机器的ID(5个bit是数据中心,5个bit的机器ID),12bit作为毫秒内的流水号(意味 着每个节点在每毫秒可以产生 4096 个 ID),最后还有一个符号位,永远是0。可以保证几乎全球唯 一!

如果不为主键添加 @TableId 注解,其默认为 @TableId=(type = IdType.ID_WORKER),由于这个枚举项已经被弃用了,并使用了 ASSIGN_ID 代替。如果这个时候用户不为主键赋值,那么 MP 会自动赋值,而此时数据库主键字段是否被设置自增也没有必要。

5、ASSIGN_UUID:MyBatis-Plus 分配 UUID,必须是 String 类型

ASSIGN_UUID 的用法与 ASSIGN_ID 类似,可以表示更长的唯一的 ID,但其主键的数据类型必须是 String,由 MyBatis-Plus 自动生成 UUID 进行赋值;

6、总结

由于数据表的主键字段不能为空,主键生成策略的一般规则如下:

如果用户或开发者为主键赋值,则直接存入该值;若用户没有为主键赋值,则由 MP(MyBatis-Plus 的简称) 为主键赋值;若用户和 MP 都没有给主键设定值,则由数据库的数据表设置主键自增来完成赋值操作;如果用户、MyBatis-Plus 以及数据库都没有给主键赋值,则程序就会抛出异常

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_41775769/article/details/123045089

智能推荐

Python3中内置类型bytes和str用法及byte和string之间各种编码转换_吮指原味张的博客-程序员秘密

  Python3中内置类型bytes和str用法及byte和string之间各种编码转换    Python 3最重要的新特性大概要算是对文本和二进制数据作了更为清晰的区

IDEA 社区版2020.3 安装lombok插件不能使用的问题(失效)解决方法_lol155的博客-程序员秘密

0.错误信息1、添加插件:安装 lombok 插件安装后,重启。2、勾选配置file–>setting–>build,excecution,deployment–>compiler–>annotation processors勾选上 enable annotation processing。重启即可生效。3. 配置-Djps.track.ap.dependencies=false打开settings–>Build,Execution…–>Compil

通信原理 —— 绪论_然后就去远行吧的博客-程序员秘密

目录1、通信原理2、通信的一般原理2.1 以电信号为物理载体的通信系统2.2 信源2.3 信道2.4 信号基础1、通信原理通信原理:通信的基本原理;通信指信息的传输;2、通信的一般原理把信息放到物理载体中,然后物理载体被传送到接收方,接收者可以通过承载着信息的物理载体识别出信息;在通信原理这门课中,考虑的载体是电信号,这里讲的是以电信号为载体的通信;2.1 以电信号为物理载体的通信系统以电信号为载体的通信系统可以建立以下模型:该模型包括信源,信源产生各种需要传输的信息或者消息;这些信息需要加

vue+node对密码进行加密解密_ZJJJi的博客-程序员秘密

文章目录前言一、密钥对生成二、vue中用jsencrypt进行res加密1. 安装 引入2. 在vue的utils下新建rsaEncrypt.js三、node使用node-rsa解密总结前言最近做的项目,需要在前端给密码进行加密,再在后端解密,项目用的是vue+node。一、密钥对生成http://web.chacuo.net/netrsakeypair二、vue中用jsencrypt进行res加密1. 安装 引入npm install jsencrypt import JSEncr

安装win10和linux双系统,安装win10和ubuntu双系统_weixin_39691055的博客-程序员秘密

2019-06-22​ 最近找了一份新的工作,要用到linux,由于之前基本上没有接触过这方面的东西,所以今天捣鼓一下,安装win10和linux双系统,办公研发双不误。如果在安装的过程中遇到什么问题,可以关注公众号 洛水梅家,后台联系我,交流一下,共同学习。win10系统可以在itellyou中下载,linux系统在公众号后台回复 ubuntu18,可以免费获取下载链接。先看一下效果图:刚开机会...

android 剪切图片并把背景色设为透明_android canvas透明背景_Ruilin-z的博客-程序员秘密

近日,在开发拼接图片中实现剪切图片并把背景色设为透明,在此分享一下实现的方法首先为确保颜色去除后变成透明,图片质量必须是Config.ARGB_4444,或者Config.ARGB_8888,通过以下方法对资源图进行转换bmp = bmp.copy(Bitmap.Config.ARGB_8888, true);然后就可以进行过滤了,代码如下:Canvas c = new C

随便推点

web前端大作业:游戏动漫网页设计(HTML+CSS+JavaScript)_web游戏网页_java_dingli的博客-程序员秘密

目录网页实现截图:主要源码展示:获取完整源码:网页实现截图:动漫官网主页:游戏动漫页面展示:招贤纳士:联系我们:关于公司:主要源码展示:游戏动漫主页.html<head> <title>游戏动漫官网-首页</title> </head><body> <li cla..

网卡的功能、构造与分类 | 什么是网卡?_追光者跑起来的博客-程序员秘密

网卡全称为网络适配器(Network Interface Card, NIC),也被称为网络接口控制器。网卡是工作在第二层链路层的一个网络组件,通常是安装在计算机上用于连接网络的电路板,可为计算机提供专用网络连接。网卡虽然仅作为计算机网络连接的一个小组件,但发挥着不可缺少的作用。网卡就像一个转换器,将数据转换为数字信号,通过使用电缆线或服务器网络上的无线路由器进行通信。网卡作为TCP/IP层的接口,可以在物理层传输信号,网络层传递数据包。无论位于哪一层,它都充当计算机/服务器和数据网络之间的中间媒介。

.rdp 文件参数详解_FY19951211的博客-程序员秘密

Overview of .rdp file settingsSettingTypeDefault valueDescription and possible valuesSettable from RDC GUI?RDP+ equivalent5.15.26.06.17.07.18.08.1admini...

Is a Green Screen Really Necessary for Real-Time Portrait Matting?_balabalabiubiu的博客-程序员秘密

Is a Green Screen Really Necessary for Real-Time Portrait Matting?论文链接:https://arxiv.org/pdf/2011.11961v2.pdf发表出处:2020 CVPR1.背景目前,实时获得高质量前景蒙版仍需要绿幕的辅助。而当前大部分不使用绿幕的抠图方法都会使用预定义 trimap 做作为输入。但trimap 需要人类标注,所需成本高昂,并且如果是通过深度相机捕获,还会出现低精度问题。而trimap-free 方法由于

个人网站的搭建(三)——留言功能(springboot+mysql)_基于mybatis的留言本_稚子候门的博客-程序员秘密

    个人网站的页面上有一个留言功能,现在实现一下。    一、设计数据库    1.mysql数据库,新建boke库。        目前只有一张留言的数据表,比较简单。CREATE TABLE `message` ( `id` varchar(32) NOT NULL COMMENT '主键', `fullName` varchar(128) DEFAULT NULL COMMENT...

Linux下scala与spark安装与配置_坐着吃灬炸鸡的博客-程序员秘密

spark安装与配置安装包具体安装与配置安装包scala-2.11.12提取码: yrrtspark-2.4.5-bin-hadoop2.6提取码: sn75具体安装与配置新建一个将安装包解压到/opt/下

推荐文章

热门文章

相关标签