大家好, 我是上白书妖!
知识源于积累,登峰造极源于自律
今天我根据以前所以学的一些文献,笔记等资料整理出一些小知识点
一、插入操作
@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策略相同,也可以通过注册自动填充插件进行填充
上白书妖结束寄语:
知识源于积累,登峰造极源于自律