修改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生成相关推荐

  1. Leaf-美团分布式ID生成服务

    Leaf : 美团分布式ID生成服务 There are no two identical leaves in the world.(世界上没有两片相同的树叶.) - 莱布尼茨 现有分布式ID生成方案 ...

  2. 滴滴开源的分布式id生成系统

    ID Generator id生成器 分布式id生成系统,简单易用.高性能.高可用的id生成系统 简介 Tinyid是用Java开发的一款分布式id生成系统,基于数据库号段算法实现,关于这个算法可以参 ...

  3. easyui treegrid获取父节点的id_超简单的分布式ID生成方案!美团开源框架介绍

    目录 阐述背景 Leaf snowflake 模式介绍 Leaf segment 模式介绍 Leaf 改造支持 RPC 阐述背景 不吹嘘,不夸张,项目中用到 ID 生成的场景确实挺多.比如业务要做幂等 ...

  4. 全局唯一递增的id_分布式ID生成方法-趋势有序的全局唯一ID

    一.需求缘起 几乎所有的业务系统,都有生成一个记录标识的需求,例如: (1)消息标识:message-id (2)订单标识:order-id (3)帖子标识:tiezi-id 这个记录标识往往就是数据 ...

  5. 细聊分布式ID生成方法

    2019独角兽企业重金招聘Python工程师标准>>> 一.需求缘起 几乎所有的业务系统,都有生成一个记录标识的需求,例如: (1)消息标识:message-id (2)订单标识:o ...

  6. Leaf:美团分布式ID生成服务开源

    Leaf是美团基础研发平台推出的一个分布式ID生成服务,名字取自德国哲学家.数学家莱布尼茨的一句话:"There are no two identical leaves in the wor ...

  7. 理解分布式id生成算法--雪花算法(SnowFlake)

    分布式ID生成算法的有很多种,Twitter的SnowFlake就是其中经典的一种. 注: 1B就是1个字节. Byte.KB.B.MB.GB之间的关系是: Bit--比特 : B --字节:KB-- ...

  8. Leaf:美团分布式ID生成服务开源 1

    Leaf是美团基础研发平台推出的一个分布式ID生成服务,名字取自德国哲学家.数学家莱布尼茨的一句话:"There are no two identical leaves in the wor ...

  9. 6位顺序号生成_分布式id生成策略,我和面试官扯了一个半小时

    一.分布式系统带来ID生成挑战 在分布式系统中,往往需要对大量的数据如订单.账户进行标识,以一个有意义的有序的序列号来作为全局唯一的ID. 而分布式系统中我们对ID生成器要求又有哪些呢? 全局唯一性: ...

最新文章

  1. /etc/rc.local 与 /etc/init.d Linux 开机自动运行程序
  2. Mysql —— C语言链接mysql数据库,实现可以增删改查的角色权限登录系统
  3. Python条件判断和循环,range()函数
  4. ab压力 failed_Apache ab 压力测试
  5. java api操作hbase_通过JavaAPI使用HBase
  6. java 三个点_Java,参数中的3个点
  7. LeetCode简单题目(#225 #226 #231 #232 #234)-5道(栈、队列、树、数字)
  8. 论文笔记_S2D.13-2017-3DV-稀疏不变的卷积神经网络(Sparsity Invariant CNNs)
  9. HDFS之存储优化纠删码原理、纠删码案例实操 、异构存储(冷热数据分离)
  10. 连接linux工具Mtr,Mac、linux和windows mtr路径探测工具安装使用
  11. 2021/04/10 OJ每日一题 1190: 按出生日期排序(结构体专题)python
  12. php做个抽签人名,基于JS实现的随机数字抽签实例
  13. oracle rman迁移spfile,RMAN 异机迁移实战操作-附加常用命令
  14. Java 之未支付订单30分钟后自动取消
  15. visio修改默认字体
  16. 最新前端开发面试题集合(非常全面)
  17. 显卡、显卡驱动、cuda、cudnn 通俗解释及深度学习环境搭建
  18. 那些英年早逝的 IT 劳模们
  19. 如何让cmd全屏显示?
  20. DZ主题模板 Discuz迪恩淘宝客购物风格商业版模板

热门文章

  1. 盘点世界排名最前的5款开源ERP软件
  2. java实现生成PDF文件
  3. 个人网站赚钱经营解密
  4. typescript-json-schema 和 ajv 检测数据是否符合指定的ts类型
  5. 特斯拉首次展示上海超级工厂内部照片 预计年底投产
  6. Html常用行级标签练习
  7. 软件性能测试分析与调优实践之路-性能分析调优思想与调优技术总结
  8. PDF怎么转换成jpg图片保存?简单几步就能解决。
  9. 2022年NOC大赛创客智慧编程赛道图形化scratch初赛题,包含答案解析
  10. iOS设备使用重力感应