MybatisPlus CRUD扩展(一)

734 阅读2分钟

这是我参与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是全局唯一id1456795944390905857是基于雪花算法生成。

主键生成策略

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(LongInteger)或String)(since 3.3.0),使用接口IdentifierGenerator的方法nextId(默认实现类为DefaultIdentifierGenerator雪花算法)
  • ASSIGN_UUID:分配UUID,主键类型为String(since 3.3.0),使用接口IdentifierGenerator的方法nextUUID(默认default方法)
  • ID_WORKER:分布式全局唯一ID,主键类型Long,后续建议使用ASSIGN_ID
  • UUID32UUID字符串,主键类型String,后续建议使用ASSIGN_UUID
  • ID_WORKER_STR:分布式全局唯一ID,主键类型String,后续建议使用ASSIGN_ID

雪花算法:snowflakeTwitter开源的分布式ID生成算法,结果是一个long型的ID。其核心思想是:使用41bit作为毫秒数,10bit作为机器的ID5个bit是数据中心,5个bit的机器ID),12bit作为毫秒内的流水号(意味着每个节点在每毫秒可以产生 4096ID),最后还有一个符号位,永远是0。可以保证几乎全球唯一。

UUID:国际标准化组织ISO提出的一个概念,是一个128bit的数字,也可以表现为3216进制的字符,中间用-分割。

  • 时间戳+UUID版本号,分三段占16个字符(60bit+4bit),
  • Clock Sequence号与保留字段,占4个字符(13bit3bit),
  • 节点标识占12个字符(48bit),
  • 示例:3F2504E0-4F89-11D3-9A0C-0305E82C3301