Mybatis-plus进阶之分布式id生成
修改MyEmp
package com.yyoo.boot.mp.beans;import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;@Data
@TableName("t_my_emp")
public class MyEmp {@TableId(type=IdType.ASSIGN_ID)private Long id;private String name;private int age;private int sex;
}
其实就是在我们的主键字段,id上添加了@TableId注解
@TableId注解IdType属性说明
值 | I说明 |
---|---|
AUTO | 数据库 ID 自增 |
NONE | 无状态,该类型为未设置主键类型(注解里等于跟随全局,全局里约等于 INPUT)默认为NONE |
INPUT | nsert 前自行 set 主键值 |
ASSIGN_ID | 分配 ID(主键类型为 Number(Long 和 Integer)或 String)(since 3.3.0),使用接口IdentifierGenerator的方法nextId |
ASSIGN_UUID | 分配 UUID,主键类型为 String(since 3.3.0),使用接口IdentifierGenerator的方法nextUUID |
配置IdentifierGenerator自动id生成器
/*** 配置id生成器*/@Beanpublic GlobalConfig globalConfig() {GlobalConfig conf = new GlobalConfig();conf.setIdentifierGenerator(new DefaultIdentifierGenerator());return conf;}
配置SqlSessionFactory设置GlobalConfig配置
@Bean(name = "sessionFactory")public SqlSessionFactory sqlSessionFactory(@Qualifier("hikariDataSource") DataSource ds) throws Exception {log.info("数据源:{},aliasesPackage:{}",ds,this.aliasesPackage);MybatisSqlSessionFactoryBean factoryBean = new MybatisSqlSessionFactoryBean();factoryBean.setDataSource(ds);if(this.aliasesPackage != null && !"".equals(this.aliasesPackage)) {factoryBean.setTypeAliasesPackage(this.aliasesPackage);}//指定mapper xml目录Assert.notEmpty(this.mapperLocations,"扫描的Mapper xml不能为空");factoryBean.setMapperLocations(resolveMapperLocations(this.mapperLocations));// 添加分页插件factoryBean.setPlugins(mybatisPlusInterceptor());// 添加id生成器的配置factoryBean.setGlobalConfig(globalConfig());return factoryBean.getObject();}
示例代码
@Testpublic void t1(){int num = 100;List<MyEmp> list = new ArrayList<>();for (int i = 0;i < num;i++) {Random random = new Random();MyEmp myEmp = new MyEmp();myEmp.setName(AutoNameUtil.autoSurAndName());myEmp.setAge(random.nextInt(50) + 15);// 15岁及以上myEmp.setSex(random.nextInt(2));list.add(myEmp);}long start = System.currentTimeMillis();myEmpService.saveBatch(list);long end = System.currentTimeMillis();System.out.println("执行时间:"+(end -start));}
AutoNameUtil类是随机生成姓名的工具类,请查看Java生成随机常用汉字或姓名一文
执行结果
IdentifierGenerator生成器详解
IdentifierGenerator是生成器的接口,DefaultIdentifierGenerator是其默认的实现,DefaultIdentifierGenerator的nextId方法默认是使用雪花算法实现的分布式id,其nextUUID方法模式是生成不带中划线的 UUID。
我们示例中的配置只是非常简单粗暴的DefaultIdentifierGenerator配置,DefaultIdentifierGenerator还有两个重载的构造方法,请大家仔细阅读源码,以及去多了解雪花算法来合理的进行配置。本文不做过多讲解。
自定义IdentifierGenerator生成器
我们自定义IdentifierGenerator,只需实现IdentifierGenerator接口,重写nextId方法即可。然后再替换上面代码DefaultIdentifierGenerator的配置即可。以下是官网示例:
public class CustomIdGenerator implements IdentifierGenerator {@Overridepublic Long nextId(Object entity) {//可以将当前传入的class全类名来作为bizKey,或者提取参数来生成bizKey进行分布式Id调用生成.String bizKey = entity.getClass().getName();//根据bizKey调用分布式ID生成long id = ....;//返回生成的id值即可.return id;}
}
问题说明
在我们前面的示例中MyEmp对象的id属性的类型为long,使用id生成器就报错,而且id生成器根本没有生成id,需要将它修改为包装类才能成功。
实际使用中我们的JavaBean对应的数字类型建议都尽量使用其包装类型来作为JavaBean的字段类型,因为非包装类是不能表示null的,特别有些可为空的字段,需要使用null这样的表示的时候。
上一篇:Mybatis-plus进阶之分页
下一篇:Mybatis-plus进阶之代码生成器
Mybatis-plus进阶之分布式id生成相关推荐
- Leaf-美团分布式ID生成服务
Leaf : 美团分布式ID生成服务 There are no two identical leaves in the world.(世界上没有两片相同的树叶.) - 莱布尼茨 现有分布式ID生成方案 ...
- 滴滴开源的分布式id生成系统
ID Generator id生成器 分布式id生成系统,简单易用.高性能.高可用的id生成系统 简介 Tinyid是用Java开发的一款分布式id生成系统,基于数据库号段算法实现,关于这个算法可以参 ...
- easyui treegrid获取父节点的id_超简单的分布式ID生成方案!美团开源框架介绍
目录 阐述背景 Leaf snowflake 模式介绍 Leaf segment 模式介绍 Leaf 改造支持 RPC 阐述背景 不吹嘘,不夸张,项目中用到 ID 生成的场景确实挺多.比如业务要做幂等 ...
- 全局唯一递增的id_分布式ID生成方法-趋势有序的全局唯一ID
一.需求缘起 几乎所有的业务系统,都有生成一个记录标识的需求,例如: (1)消息标识:message-id (2)订单标识:order-id (3)帖子标识:tiezi-id 这个记录标识往往就是数据 ...
- 细聊分布式ID生成方法
2019独角兽企业重金招聘Python工程师标准>>> 一.需求缘起 几乎所有的业务系统,都有生成一个记录标识的需求,例如: (1)消息标识:message-id (2)订单标识:o ...
- Leaf:美团分布式ID生成服务开源
Leaf是美团基础研发平台推出的一个分布式ID生成服务,名字取自德国哲学家.数学家莱布尼茨的一句话:"There are no two identical leaves in the wor ...
- 理解分布式id生成算法--雪花算法(SnowFlake)
分布式ID生成算法的有很多种,Twitter的SnowFlake就是其中经典的一种. 注: 1B就是1个字节. Byte.KB.B.MB.GB之间的关系是: Bit--比特 : B --字节:KB-- ...
- Leaf:美团分布式ID生成服务开源 1
Leaf是美团基础研发平台推出的一个分布式ID生成服务,名字取自德国哲学家.数学家莱布尼茨的一句话:"There are no two identical leaves in the wor ...
- 6位顺序号生成_分布式id生成策略,我和面试官扯了一个半小时
一.分布式系统带来ID生成挑战 在分布式系统中,往往需要对大量的数据如订单.账户进行标识,以一个有意义的有序的序列号来作为全局唯一的ID. 而分布式系统中我们对ID生成器要求又有哪些呢? 全局唯一性: ...
最新文章
- /etc/rc.local 与 /etc/init.d Linux 开机自动运行程序
- Mysql —— C语言链接mysql数据库,实现可以增删改查的角色权限登录系统
- Python条件判断和循环,range()函数
- ab压力 failed_Apache ab 压力测试
- java api操作hbase_通过JavaAPI使用HBase
- java 三个点_Java,参数中的3个点
- LeetCode简单题目(#225 #226 #231 #232 #234)-5道(栈、队列、树、数字)
- 论文笔记_S2D.13-2017-3DV-稀疏不变的卷积神经网络(Sparsity Invariant CNNs)
- HDFS之存储优化纠删码原理、纠删码案例实操 、异构存储(冷热数据分离)
- 连接linux工具Mtr,Mac、linux和windows mtr路径探测工具安装使用
- 2021/04/10 OJ每日一题 1190: 按出生日期排序(结构体专题)python
- php做个抽签人名,基于JS实现的随机数字抽签实例
- oracle rman迁移spfile,RMAN 异机迁移实战操作-附加常用命令
- Java 之未支付订单30分钟后自动取消
- visio修改默认字体
- 最新前端开发面试题集合(非常全面)
- 显卡、显卡驱动、cuda、cudnn 通俗解释及深度学习环境搭建
- 那些英年早逝的 IT 劳模们
- 如何让cmd全屏显示?
- DZ主题模板 Discuz迪恩淘宝客购物风格商业版模板