这是我参与11月更文挑战的第7天,活动详情查看:2021最后一次更文挑战
Insert插入
//测试插入
@Test
public void testInsert() {
User user = new User();
user.setName("zbc");
user.setAge(20);
user.setEmail("test@163.com");
//帮我们自动生成id
int result = userMapper.insert(user);
//受影响的行数
System.out.println(result);
//发现,id会自动回填
System.out.println(user);
}
Creating a new SqlSession
SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@18715bb] was not registered for synchronization because synchronization is not active
JDBC Connection [HikariProxyConnection@1180105925 wrapping com.mysql.cj.jdbc.ConnectionImpl@2c16677c] will not be managed by Spring
==> Preparing: INSERT INTO user ( id, name, age, email ) VALUES ( ?, ?, ?, ? )
==> Parameters: 1456795944390905857(Long), zbc(String), 20(Integer), test@163.com(String)
<== Updates: 1
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@18715bb]
1
User(id=1456795944390905857, name=zbc, age=20, email=test@163.com)
数据库插入的id是全局唯一id,1456795944390905857是基于雪花算法生成。
主键生成策略
在MybatisPlus中关于主键生成策略有一个专门的注解(@TableId)
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD})
public @interface TableId {
String value() default "";
IdType type() default IdType.NONE;
}
IdType是策略的类型
public enum IdType {
AUTO(0),
NONE(1),
INPUT(2),
ASSIGN_ID(3),
ASSIGN_UUID(4);
private final int key;
}
AUTO:数据库ID自增- 需要在实体类字段上添加
@TableId(type = IdType.AUTO) - 数据库字段也必须是自增。
- 再次测试,我们发现
id自增1
- 需要在实体类字段上添加
NONE: 默认方案,未设置主键INPUT:插入前手动设置主键,一旦设置之后就需要配置id了ASSIGN_ID:分配ID(主键类型为Number(Long和Integer)或String)(since 3.3.0),使用接口IdentifierGenerator的方法nextId(默认实现类为DefaultIdentifierGenerator雪花算法)ASSIGN_UUID:分配UUID,主键类型为String(since 3.3.0),使用接口IdentifierGenerator的方法nextUUID(默认default方法):分布式全局唯一ID_WORKERID,主键类型Long,后续建议使用ASSIGN_ID:UUID32为UUID字符串,主键类型String,后续建议使用ASSIGN_UUID:分布式全局唯一ID_WORKER_STRID,主键类型String,后续建议使用ASSIGN_ID
雪花算法:snowflake是Twitter开源的分布式ID生成算法,结果是一个long型的ID。其核心思想是:使用41bit作为毫秒数,10bit作为机器的ID(5个bit是数据中心,5个bit的机器ID),12bit作为毫秒内的流水号(意味着每个节点在每毫秒可以产生 4096 个 ID),最后还有一个符号位,永远是0。可以保证几乎全球唯一。
UUID:国际标准化组织ISO提出的一个概念,是一个128bit的数字,也可以表现为32个16进制的字符,中间用-分割。
- 时间戳+
UUID版本号,分三段占16个字符(60bit+4bit), Clock Sequence号与保留字段,占4个字符(13bit+3bit),- 节点标识占
12个字符(48bit), - 示例:
3F2504E0-4F89-11D3-9A0C-0305E82C3301