主键生成策略的几种方式
- 数据库自增:利用数据库主键自增,优点:简单、便于排序,缺点:数据库迁移需要特殊处理,分库分表难以扩展。
- UUID:用程序生成UUID的形式生成主键id,优点:简单,性能好,缺点:没有排序,字符串存储,查询效率低。
- Redis:Redis通过原子操作 INCR和INCRBY生成id。优点:id天然排序。缺点:需要redis组件,编码配置工作量大。
- Twitter的snowflake算法(雪花算法):生成一个19位的数字。使用41bit作为毫秒数,10bit作为机器的ID(5个bit是数据中心,5个bit的机器ID),12bit作为毫秒内的流水号(意味着每个节点在每毫秒可以产生 4096 个 ID),最后还有一个符号位,永远是0。https://github.com/twitter/snowflake,snowflake算法可以根据自身项目的需要进行一定的修改。比如估算未来的数据中心个数,每个数据中心的机器数以及统一毫秒可以能的并发数来调整在算法中所需要的bit数。优点:id在单机上是递增的,性能较高。缺点:由于分布式环境中每台机器时钟不是完全同步,可能出现不是全局递增的情况。
Mybatis-Plus主键策略配置方式
代码示例:
/**
* @author : sunkepeng E-mail:sunkepeng@hisense.com
* @date : 2021/1/7 Tel:15610057380
*/
@Data
public class User {
@TableId(type = IdType.ID_WORKER)
private Long id;
private String name;
private Integer age;
private String email;
}
- 要想主键自增需要配置如下主键策略
-
- 需要在创建数据表的时候设置主键自增
- 实体字段中配置 @TableId(type = IdType.AUTO)
要想影响所有实体的配置,可以设置全局主键配置
#全局设置主键生成策略
mybatis-plus.global-config.db-config.id-type=auto
mybatis-plus自带的主键策略类
public enum IdType {
/**
* 数据库ID自增
*/
AUTO(0),
/**
* 该类型为未设置主键类型
*/
NONE(1),
/**
* 用户输入ID13
* 该类型可以通过自己注册自动填充插件进行填充
*/
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;
}
}