第二章: CRUD接口-主键策略

大家好, 我是上白书妖!

知识源于积累,登峰造极源于自律

今天我根据以前所以学的一些文献,笔记等资料整理出一些小知识点

一、插入操作

@RunWith(SpringRunner.class)
@SpringBootTest
@Slf4j
public class CRUDTests {

    @Autowired
    private UserMapper userMapper;

    @Test
    public void testInsert(){

        User user = new User();
        user.setName("上白书妖");
        user.setAge(18);
        user.setEmail("[email protected]");

        int result = userMapper.insert(user);
        log.info("影响的行数:" + result); //影响的行数
        log.info("id:" + user); //id自动回填
    }
}

注意:数据库插入id值默认为:全局唯一id
上白书妖博客

二、主键策略

1、ID_WORKER

MyBatis-Plus默认的主键策略是:ID_WORKER 全局唯一ID(分布式ID生成器)

@TableId(type = IdType.ID_WORKER)
private String id;

背景:
阿里的MySQL数据库开发规范中单表行数超过 500 万行或者单表容量超过 2GB,推荐进行分库分表。分布式数据库环境中为了能够生成全局唯一的、不重复的、自增的主键,不能简单的使用数据库自带的ID自增技术

雪花算法:snowflake是Twitter开源的分布式ID生成算法,结果是一个Long型或String型的ID

核心思想:
长度共64bit(一个long型):0 - 0000000000 0000000000 0000000000 0000000000 0 - 00000 - 00000 - 000000000000
首先是一个符号位,1bit标识,由于long基本类型在Java中是带符号的,最高位是符号位,正数是0,负数是1,所以id一般是正数,最高位是0
41bit时间截(毫秒级),注意,41bit时间截不是存储当前时间的时间截,而是存储时间截的差值(当前时间截 - 开始时间截)
10bit作为机器的ID(5个bit是数据中心,5个bit的机器ID,可以部署在1024个节点)
12bit作为毫秒内的流水号(意味着每个节点在每毫秒可以产生 4096 个 ID)。

优点:整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由数据中心ID和机器ID作区分),并且效率较高,经测试,SnowFlake每秒能够产生26万ID左右。

参考资料:分布式系统唯一ID生成方案汇总

其他主键策略:分析 IdType 源码可知

@Getter
public enum IdType {
    /**
     * 数据库ID自增
     */
    AUTO(0),
    /**
     * 该类型为未设置主键类型
     */
    NONE(1),
    /**
     * 用户输入ID
     * 该类型可以通过自己注册自动填充插件进行填充
     */
    INPUT(2),

    /* 以下3种类型、只有当插入对象ID 为空,才自动填充。 */
    /**
     * 全局唯一ID (idWorker)
     */
    ID_WORKER(3),
    /**
     * 全局唯一ID (UUID)
     */
    UUID(4),
    /**
     * 字符串全局唯一ID (idWorker 的字符串表示)
     */
    ID_WORKER_STR(5);

    private int key;

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

2、AUTO 自增策略

  • 需要在创建数据表的时候设置主键自增
  • 实体字段中配置 @TableId(type = IdType.AUTO)
@TableId(type = IdType.AUTO)
private Long id;

要想影响所有实体的配置,可以设置全局主键配置

#全局设置主键生成策略
mybatis-plus.global-config.db-config.id-type=auto

3、ID_WORKER_STR

  • 需要在创建数据表的时候设置varchar(19)
  • 实体字段中配置 @TableId(type = IdType.ID_WORKER_STR)
@TableId(type = IdType.ID_WORKER_STR)
private String id;

4、UUID

  • 需要在创建数据表的时候设置varchar(32)
  • 实体字段中配置 @TableId(type = IdType.UUID)
@TableId(type = IdType.UUID)
private String id;

5、NONE

  • 数据库表字段根据业务需求设置
  • 实体字段中配置 @TableId(type = IdType.NONE)
@TableId(type = IdType.NONE)
private String id;

6、INPUT

  • 数据库表字段根据业务需求设置
  • 实体字段中配置 @TableId(type = IdType.INPUT)
@TableId(type = IdType.INPUT)
private String id;

基本使用方式和NONE策略相同,也可以通过注册自动填充插件进行填充

上白书妖结束寄语:
知识源于积累,登峰造极源于自律

发布了10 篇原创文章 · 获赞 1 · 访问量 280

猜你喜欢

转载自blog.csdn.net/weixin_45016497/article/details/103839395