[{"createTime":1735734952000,"id":1,"img":"hwy_ms_500_252.jpeg","link":"https://activity.huaweicloud.com/cps.html?fromacct=261f35b6-af54-4511-a2ca-910fa15905d1&utm_source=V1g3MDY4NTY=&utm_medium=cps&utm_campaign=201905","name":"华为云秒杀","status":9,"txt":"华为云38元秒杀","type":1,"updateTime":1735747411000,"userId":3},{"createTime":1736173885000,"id":2,"img":"txy_480_300.png","link":"https://cloud.tencent.com/act/cps/redirect?redirect=1077&cps_key=edb15096bfff75effaaa8c8bb66138bd&from=console","name":"腾讯云秒杀","status":9,"txt":"腾讯云限量秒杀","type":1,"updateTime":1736173885000,"userId":3},{"createTime":1736177492000,"id":3,"img":"aly_251_140.png","link":"https://www.aliyun.com/minisite/goods?userCode=pwp8kmv3","memo":"","name":"阿里云","status":9,"txt":"阿里云2折起","type":1,"updateTime":1736177492000,"userId":3},{"createTime":1735660800000,"id":4,"img":"vultr_560_300.png","link":"https://www.vultr.com/?ref=9603742-8H","name":"Vultr","status":9,"txt":"Vultr送$100","type":1,"updateTime":1735660800000,"userId":3},{"createTime":1735660800000,"id":5,"img":"jdy_663_320.jpg","link":"https://3.cn/2ay1-e5t","name":"京东云","status":9,"txt":"京东云特惠专区","type":1,"updateTime":1735660800000,"userId":3},{"createTime":1735660800000,"id":6,"img":"new_ads.png","link":"https://www.iodraw.com/ads","name":"发布广告","status":9,"txt":"发布广告","type":1,"updateTime":1735660800000,"userId":3},{"createTime":1735660800000,"id":7,"img":"yun_910_50.png","link":"https://activity.huaweicloud.com/discount_area_v5/index.html?fromacct=261f35b6-af54-4511-a2ca-910fa15905d1&utm_source=aXhpYW95YW5nOA===&utm_medium=cps&utm_campaign=201905","name":"底部","status":9,"txt":"高性能云服务器2折起","type":2,"updateTime":1735660800000,"userId":3}]
<>目标:
了解 Mybatis-Plus 它的主键生成算法
<>学习步骤:
1、何为❄雪花算法
2、实现雪花ID自增
3、了解MyBatis-Plus 的主键生成策略 ⇒ IdType 枚举类
<>一、❄雪花算法是什么?
<>一个long类型的Java 长整型数字
<>核心思想:使用 41 bit 作为 毫秒数, 10 bit 作为机器 ID(5个bit是数据中心,5个bit是机器ID),12 bit 作为
毫秒内的流水号(意味着每个节点在每毫秒可以产生4096个ID),最后还有一个符号位,永远是0,几乎可以保证全球唯一 !
<>二、代码测试一波
此处接的是上一篇 MyBatis-Plus博文的数据库和代码
@Test void testInsert(){ User user = new User(); user.setName("CSNZ"); user.
setAge(21); int res = userMapper.insert(user); System.out.println(res); }
<>实体类字段上加上 @TableId(type = IdType.ID_WORKER)
<>插入成功,查看数据库数据
<>此时这个 id 就是雪花ID ❄
<>再执行一次呢?
<>确实是不同的,但此时id却不是自增的,如果我们想要他自增呢?如何实现?
<>尝试数据库中设置id主键自增,再插入试试
<>发现不得行啊!
<>得在实体类字段上加上 @TableId(type = IdType.AUTO)
<>IdType 的属性值默认为 AUTO
<>现在有了这两个 前提条件下 再插入数据试试
<>成功了!
<>实现雪花id
<>实体类字段需 加上 @TableId(type = IdType.ID_WORKER)
<>如果想实现主键自增
<>1、实体类字段需 加上 @TableId(type = IdType.AUTO)
<>2、数据库字段一定要是自增的!
<>三、那么到这里肯定就有疑惑了,这个TableId究竟是啥玩意儿~
<>可以看到这是一个注解,有value属性和 type 属性,并且type属性的默认值为 NONE
<>进一步可以看到IdType 又是一个枚举类
<>MyBatis-Plus 的主键生成策略 就是取决于这些枚举变量!
<>mybatis-plus3.3.0之后,共有五种主键生成策略
public enum IdType { /** * 数据库ID自增,数据库需要支持主键自增(如MySQL),并设置主键自增 */ AUTO(0), /**
* 该类型为未设置主键类型,默认使用雪花算法生成 */ NONE(1), /** * 用户输入ID,数据类型和数据库保持一致就行 *
<p>该类型可以通过自己注册自动填充插件进行填充</p> */ INPUT(2), /* 以下3种类型、只有当插入对象ID 为空,才自动填充。 */ /**
* 全局唯一ID (idWorker),数值类型 数据库中也必须是数值类型 否则会报错 */ ID_WORKER(3), /** * 全局唯一ID
(UUID,不含中划线) */ UUID(4), /** * 字符串全局唯一ID (idWorker 的字符串表示),数据库也要保证一样字符类型 */
ID_WORKER_STR(5); }