Mybatis-plus 主键生成策略详解

2年前 (2022) 程序员胖胖胖虎阿
300 0 0

1.1 简述

Mybatis-plus提供了多种主键生成策略, 可以在Pojo类中主键上加注解进行配置,例如数据库主键自增 @TableId(type=IdType.AUTO)

1.2 五种策略

Mybatis-plus 主键生成策略详解

1.2.1 AUTO(自动增长策略)

AUTO自动增长策略,这个配合数据库使用,Mysql可以,但是Oracle不行。不配合会报错,这里就不细展开了,有兴趣的同学可以去试一试。

在主键字段上加上 @TableId(type = IdType.AUTO)

@Data
public class UserInfo {
    //指定主键使用数据库ID自增策略
    @TableId(type = IdType.AUTO)
    private Integer id;
    private String userName;
    private String passWord;
}

1.2.2 Input(自定义输入策略)

自定义输入策略:如果不想使用数据库的自增主键,也可以使用INPUT进行自己传递主键即可,进行插入工作,但在插入之前一定要检查数据库是否已经存在了该主键。

Mybatis-Plus 内置了如下数据库主键序列(如果内置支持不满足你的需求,可实现 IKeyGenerator 接口来进行扩展):

DB2KeyGenerator
H2KeyGenerator
KingbaseKeyGenerator
OracleKeyGenerator
PostgreKeyGenerator

使用方法如下所示:

首先添加@Bean

 @Bean
    public OracleKeyGenerator oracleKeyGenerator(){
        return new OracleKeyGenerator();
    }

然后实体类配置主键 Sequence,指定主键策略为IdType.INPUT即可:

@Data
@KeySequence(value = "SEQ_ACL_ROLE" , clazz = Integer.class)
public class AclUser implements Serializable {
    private static final long serialVersionUID = 780903014942735924L;
    @TableId(value = "ID",type = IdType.INPUT)
    private Integer id;

1.2.3 ASSIGN_ID(雪花算法)

如果不设置type值,默认则使用IdType.ASSIGN_ID策略(自 3.3.0 起)。该策略会使用雪花算法自动生成主键 ID,主键类型为 Long String

雪花算法SnowFlake)是 Twitter 开源的分布式 id 生成算法。其核心思想就是:使用一个 64 bit long 型的数字作为全局唯一 id。在分布式系统中的应用十分广泛,且 ID 引入了时间戳,基本上保持自增的。

使用方法
指定主键生成策略使用雪花算法(默认策略)

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

1.2.4 ASSIGN_UUID(不含中划线的UUID)

如果使用 IdType.ASSIGN_UUID 策略,则会自动生成不含中划线的 UUID 作为主键,主键类型为 String

使用方法

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

1.2.5 NONE(无状态)

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

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

mybatis-plus.global-config.db-config.id-type=auto

1.3 提示(坑)

这也是我最近在做项目的时候发现的,详情如下:

  • 将表test中,已有的num字段,设置默认值为0
    Mybatis-plus 主键生成策略详解

    alter table test alter column num set default 0;
    

    此时设置为0成功。

  • 下面插入数据

    insert into test values(null,"张三",18,null);
    

Mybatis-plus 主键生成策略详解
此时我们发现num字段为插入的null,而并不是我们设置的默认值0

  • 此时只插入name
insert into test (name) values("李四");

Mybatis-plus 主键生成策略详解
此时我们可以看到“李四”的默认值变成了0

结论Mysql 的默认值只有在insert语句中没有这个字段时才会生效,如果insert中有插入该字段而该字段取值又为nullnull值将被插入到表中,默认值此时失效。使用Mybatis操作也是一样的道理,只要这个实体里面含有这个字段,并且值为null,则不会插入默认值。

版权声明:程序员胖胖胖虎阿 发表于 2022年9月14日 下午4:00。
转载请注明:Mybatis-plus 主键生成策略详解 | 胖虎的工具箱-编程导航

相关文章

暂无评论

暂无评论...