MybatisPlus CRUD扩展(一)
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_WORKER
:分布式全局唯一ID
,主键类型Long
,后续建议使用ASSIGN_ID
UUID
:32
为UUID
字符串,主键类型String
,后续建议使用ASSIGN_UUID
ID_WORKER_STR
:分布式全局唯一ID
,主键类型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
作者:万恶的沫白
链接:https://juejin.cn/post/7027791340553535525