• MyBatisPlus(十四)主键策略


    说明

    MyBatis Plus 集成了多种主键策略,帮助用户快速生成主键。

    1. 雪花算法ID(默认策略)(推荐)
    2. UUID
    3. 自增ID
    4. 用户输入ID(必须用户每次插入数据时,手动传入ID)

    雪花算法ID:IdType.ASSIGN_ID(推荐)

    默认情况,全局使用的,就是雪花算法ID。也就是说,id字段在没有指定任何主键策略时,插入数据就是使用的雪花算法生成的ID。

    注解

    如果全局使用雪花算法ID,这个注解可以不加。

    @TableId(type = IdType.ASSIGN_ID)
    
    • 1

    代码

    package com.example.web.entity;
    
    import com.baomidou.mybatisplus.annotation.IdType;
    import com.baomidou.mybatisplus.annotation.TableId;
    import lombok.Data;
    
    @Data
    public class User {
        @TableId(type = IdType.ASSIGN_ID)
        private Long id;
        private String name;
        private Integer age;
        private String email;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
        @Test
        public void insert() {
            User user = new User();
            user.setName("赵一");
            user.setAge(26);
            user.setEmail("zhaoyi@example.com");
    
            mapper.insert(user);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    效果

    在这里插入图片描述

    在这里插入图片描述

    雪花算法ID,能够保证有序。

    依次插入四条数据

        @Test
        public void insert() {
            insert("赵一");
            insert("赵二");
            insert("赵三");
            insert("赵四");
        }
    
    
        public void insert(String name) {
            User user = new User();
            user.setName(name);
            user.setAge(26);
            user.setEmail("zhaoyi@example.com");
    
            mapper.insert(user);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    在这里插入图片描述

    UUID:IdType.ASSIGN_UUID(不推荐)

    注解

    @TableId(type = IdType.ASSIGN_UUID)
    
    • 1

    代码

    package com.example.web.entity;
    
    import com.baomidou.mybatisplus.annotation.IdType;
    import com.baomidou.mybatisplus.annotation.TableId;
    import lombok.Data;
    
    @Data
    public class User {
        @TableId(type = IdType.ASSIGN_UUID)
        private Long id;
        private String name;
        private Integer age;
        private String email;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
        @Test
        public void insert() {
            User user = new User();
            user.setName("赵一");
            user.setAge(26);
            user.setEmail("zhaoyi@example.com");
    
            mapper.insert(user);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    效果

    在这里插入图片描述
    在这里插入图片描述

    不推荐原因

    连续插入的数据,使用UUID无法保证有序。

    在大负载和高并发的系统中,需要保证 主键ID 的有序性,以此来保证数据库的性能。ID无序,会导致数据插入到表的中间位置,导致频繁的磁盘IO。

    示例如下

    代码

        @Test
        public void insert() {
            insert("赵一");
            insert("赵二");
            insert("赵三");
            insert("赵四");
        }
    
    
        public void insert(String name) {
            User user = new User();
            user.setName(name);
            user.setAge(26);
            user.setEmail("zhaoyi@example.com");
    
            mapper.insert(user);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    数据库中的数据

    在这里插入图片描述

    自增ID:IdType.AUTO

    该类型请确保数据库设置了 ID自增,否则无效(会报错)。

    报错信息查看文章后面的《报错示例》

    注解

    @TableId(type = IdType.AUTO)
    
    • 1

    代码与测试

    package com.example.web.entity;
    
    import com.baomidou.mybatisplus.annotation.IdType;
    import com.baomidou.mybatisplus.annotation.TableId;
    import lombok.Data;
    
    @Data
    public class User {
        @TableId(type = IdType.AUTO)
        private Long id;
        private String name;
        private Integer age;
        private String email;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
        @Test
        public void insert() {
            User user = new User();
            user.setName("赵一");
            user.setAge(26);
            user.setEmail("zhaoyi@example.com");
    
            mapper.insert(user);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    效果

    在这里插入图片描述
    在这里插入图片描述

    用户输入ID:IdType.INPUT

    注解

    @TableId(type = IdType.INPUT)
    
    • 1

    代码

    package com.example.web.entity;
    
    import com.baomidou.mybatisplus.annotation.IdType;
    import com.baomidou.mybatisplus.annotation.TableId;
    import lombok.Data;
    
    @Data
    public class User {
        @TableId(type = IdType.INPUT)
        private Long id;
        private String name;
        private Integer age;
        private String email;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
        @Test
        public void insert() {
            User user = new User();
            user.setId(9L);
            user.setName("赵一");
            user.setAge(26);
            user.setEmail("zhaoyi@example.com");
    
            mapper.insert(user);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    效果

    指定id之后,插入数据成功 在这里插入图片描述
    在这里插入图片描述

    未指定ID报错

    如果不指定id,也就是 setId() 方法没调用,会报错:

    Column ‘id’ cannot be null

    在这里插入图片描述

    补充:报错示例(IdType.AUTO)

    当 MySQL 数据库中的表,ID并没有自增,但是代码中的id是自增,此时新增一条数据,会报错。

    实体类

    package com.example.web.entity;
    
    import com.baomidou.mybatisplus.annotation.IdType;
    import com.baomidou.mybatisplus.annotation.TableId;
    import lombok.Data;
    
    @Data
    public class User {
        @TableId(type = IdType.AUTO)
        private Long id;
        private String name;
        private Integer age;
        private String email;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    插入数据方法

        @Test
        public void insert() {
            User user = new User();
            user.setName("赵一");
            user.setAge(26);
            user.setEmail("zhaoyi@example.com");
    
            mapper.insert(user);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    报错信息

    在这里插入图片描述

    算法介绍

    雪花算法

    在这里插入图片描述
    在这里插入图片描述

    UUID(MyBatis Plus)

    在这里插入图片描述

    UUID(常规)

    在这里插入图片描述
    在这里插入图片描述

  • 相关阅读:
    bash shell 无法使用 perl 正则
    electron解决下载慢(亲测有效)
    邢福有老师 找准公文写作要点,避开这3种毛病
    LINUX下查看CPU负载的所有命令
    Tomcat安装及使用
    MMDet3D——报错解决:KeyError: ‘XXX is not in the models registry‘
    SpringBoot 使用EasyExcel 导出Excel报表(单元格合并)
    dubbo admin 无法启动提示:zookeeper not connected 解决方案
    Socket作用及其使用
    SSL证书一次性购买多年期,有什么好处?
  • 原文地址:https://blog.csdn.net/sgx1825192/article/details/133623431