在mybatis-plus中ID生成策略主要是注解@TableId(type=IdType,XXXX)来生成,主要有以下类别

public enum IdType {

AUTO(0), //数据库 ID 自增

NONE(1), //无状态,该类型为未设置主键类型(注解里等于跟随全局,全局里约等于 INPUT)

INPUT(2), //insert 前自行 set 主键值

ASSIGN_ID(3), //自定义实现可以通过接口IdentifierGenerator的方法nextId来实现,默认是实现类DefaultIdentifierGenerator

ASSIGN_UUID(4); //分配 UUID

}

这里主要介绍一下自定义ID生成

1.生成CustomIdGenerator类

public class CustomIdGenerator implements IdentifierGenerator {

@Override

public Number nextId(Object entity) {

Date date=new Date();

System.out.println( date);

SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");

String id=format.format( date) ;

System.out.println( "generator id:"+id);

return Long.parseLong(id);

}

}

2.在Configuration类生成Bean

@Configuration

public class MybatisPlusConfig {

@Bean

public CustomIdGenerator customIdGenerator(){

return new CustomIdGenerator();

}

3.在实体类别指ID.Type为ASSIGN_ID

@Data

public class User extends Model<User> {

private Long id;

@TableId(type = IdType.ASSIGN_ID)

private String specid;

private String name;

private Integer age;

private String email;

private int deleted;

@TableField(fill = FieldFill.INSERT_UPDATE)

private LocalDateTime createtime;

@Version

private long version;

private String fab;

}

4.准备测试方法

@Test

public void testSave(){

for(long i=25;i<26;i++) {

User user = new User();

user.setId(400+i);

user.setAge((int)i+30);

user.setEmail("zoulinlin"+i+"@163.com");

user.setName("zouli"+i);

int row = userMapper.insert(user);

System.out.println(row);

}

}

运行log:

Wed Oct 12 15:01:36 GMT+08:00 2022

generator id:20221012150136

insertFill

2022-10-12 15:01:39.725 DEBUG 19684 --- [ main] c.m.service.mapper.UserMapper.insert : ==> Preparing: INSERT INTO user (specid, id, name, age, email, deleted, createtime, version, FAB) VALUES (?, ?, ?, ?, ?, ?, ?, ?, 'FAB1')

2022-10-12 15:01:39.772 DEBUG 19684 --- [ main] c.m.service.mapper.UserMapper.insert : ==> Parameters: 20221012150136(String), 425(Long), zouli25(String), 55(Integer), zoulinlin25@163.com(String), 0(Integer), 2022-10-12T15:01:36.866(LocalDateTime), 0(Long)

Consume Time:79 ms 2022-10-12 15:01:39

Execute SQL:INSERT INTO user (specid, id, name, age, email, deleted, createtime, version, FAB) VALUES ('20221012150136', 425, 'zouli25', 55, 'zoulinlin25@163.com', 0, '2022-10-12T15:01:36.866', 0, 'FAB1')

从上面可以看出我们生成的ID只能是数据值,那么如何我们想生成字符串的如何进行?

1.首先我们可以看一下接口IdentifierGenerator代码,里面有一个nextUUID方法,其实是给IdType.ASSIGN_UUID使用

public interface IdentifierGenerator {

default boolean assignId(Object idValue) {

return StringUtils.checkValNull(idValue);

}

Number nextId(Object entity);

default String nextUUID(Object entity) {

return IdWorker.get32UUID();

}

}

2.根据1中的理解在自定义ID生成类把nextUUID方法覆盖

public class CustomIdGenerator implements IdentifierGenerator {

@Override

public Number nextId(Object entity) {

Date date=new Date();

System.out.println( date);

SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");

String id=format.format( date) ;

System.out.println( "generator id:"+id);

return Long.parseLong(id);

}

@Override

public String nextUUID(Object entity) {

Date date=new Date();

System.out.println( date);

SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");

String id=format.format( date) ;

return "lot-"+id;

}

}

3.在实体中把id类型修改为ASSIGN_UUID

@Data

public class User extends Model<User> {

private Long id;

@TableId(type = IdType.ASSIGN_UUID)

private String specid;

private String name;

private Integer age;

private String email;

private int deleted;

@TableField(fill = FieldFill.INSERT_UPDATE)

private LocalDateTime createtime;

@Version

private long version;

private String fab;

}

4.准备测试方法

@Test

public void testSave(){

for(long i=26;i<27;i++) {

User user = new User();

user.setId(400+i);

user.setAge((int)i+30);

user.setEmail("zoulinlin"+i+"@163.com");

user.setName("zouli"+i);

int row = userMapper.insert(user);

System.out.println(row);

}

}

运行log

Wed Oct 12 15:09:44 GMT+08:00 2022

insertFill

2022-10-12 15:09:47.266 DEBUG 14532 --- [ main] c.m.service.mapper.UserMapper.insert : ==> Preparing: INSERT INTO user (specid, id, name, age, email, deleted, createtime, version, FAB) VALUES (?, ?, ?, ?, ?, ?, ?, ?, 'FAB1')

2022-10-12 15:09:47.322 DEBUG 14532 --- [ main] c.m.service.mapper.UserMapper.insert : ==> Parameters: lot-20221012150944(String), 426(Long), zouli26(String), 56(Integer), zoulinlin26@163.com(String), 0(Integer), 2022-10-12T15:09:44.528(LocalDateTime), 0(Long)

Consume Time:138 ms 2022-10-12 15:09:47

Execute SQL:INSERT INTO user (specid, id, name, age, email, deleted, createtime, version, FAB) VALUES ('lot-20221012150944', 426, 'zouli26', 56, 'zoulinlin26@163.com', 0, '2022-10-12T15:09:44.528', 0, 'FAB1')

2022-10-12 15:09:47.462 DEBUG 14532 --- [ main] c.m.service.mapper.UserMapper.insert : <== Updates: 1

1

从以上运行日志中启用新的规则

第十四章:mybatis-plus 自定义ID生成策略相关推荐

  1. 【.NET Core项目实战-统一认证平台】第十四章 授权篇-自定义授权方式

    上篇文章我介绍了如何强制令牌过期的实现,相信大家对IdentityServer4的验证流程有了更深的了解,本篇我将介绍如何使用自定义的授权方式集成老的业务系统验证,然后根据不同的客户端使用不同的认证方 ...

  2. 《深入理解 Spring Cloud 与微服务构建》第十四章 服务链路追踪 Spring Cloud Sleuth

    <深入理解 Spring Cloud 与微服务构建>第十四章 服务链路追踪 Spring Cloud Sleuth 文章目录 <深入理解 Spring Cloud 与微服务构建> ...

  3. 《Dreamweaver CS6 完全自学教程》笔记 第十四章:使用 CSS 设计网页

    文章目录 第十四章:使用 CSS 设计网页 14.1 CSS 样式表简介 14.2 CSS 的基本语法 14.3 伪类.伪元素以及样式表的层叠顺序 14.3.1 伪类和伪元素 14.3.2 样式表的层 ...

  4. Frank Luna DirectX12阅读笔记:绘制进阶(第八章-第十四章)

    目录 第八章 光照 8.1 光和材质的交互 8.2 法向 8.3 光照中其他重要的向量 8.4 Lambert余弦定律 8.5 散射光(diffuse lighting) 8.6 环境光(ambien ...

  5. 微信小程序(第二十四章)- 数据交互前置

    微信小程序(第二十四章)- 数据交互前置 讲解微信小程序前置的原因 参考文档 理解微信小程序 小程序简介 作用 提问 针对提问--uni-app介绍 小程序和普通网页开发的区别 小程序代码构成 文件个 ...

  6. 【正点原子Linux连载】第六十四章 Linux 多点电容触摸屏实验 -摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0

    1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码+手册+视频下载地址: ...

  7. 鸟哥的Linux私房菜(基础篇)- 第十四章、Linux 账号管理与 ACL 权限配置

    第十四章.Linux账号管理与 ACL 权限配置 最近升级日期:2009/09/09 要登陆 Linux 系统一定要有账号与口令才行,否则怎么登陆,您说是吧?不过,不同的使用者应该要拥有不同的权限才行 ...

  8. 谭浩强《C++程序设计》书后习题 第十三章-第十四章

    2019独角兽企业重金招聘Python工程师标准>>> 最近要复习一下C和C++的基础知识,于是计划把之前学过的谭浩强的<C程序设计>和<C++程序设计>习题 ...

  9. fpga驱动rgb液晶屏_正点原子开拓者FPGA开发板资料连载第五十四章基于的数字识别实验...

    1)实验平台:正点原子开拓者FPGA 开发板 2)摘自<开拓者FPGA开发指南>关注官方微信号公众号,获取更多资料:正点原子 3)全套实验源码+手册+视频下载地址:http://www.o ...

最新文章

  1. 第 28 小时项目管理过程实践和案例分析
  2. MCPlayerKit 0.0.6 Release
  3. MIT线性代数:20.克拉默法则,逆矩阵和体积
  4. 基于java的数据结构学习——数组实现的队列和循环队列及性能对比
  5. Drawable之color示例
  6. python代码-20个Python代码段,你需要立刻学会,好用到哭!
  7. volatile c语言_C语言系列文章之volatile
  8. ❄️全网最详细的Python入门基础教程,Python最全教程(非常详细,整理而来)
  9. UG NX二次开发(C#)-建模-判断一张面是孔面还是凸台面
  10. ISPRS2022/遥感:Cross-spatiotemporal LULC from VHR remote sensing images基于深度学习域适应的VHR遥感影像跨时空土地覆盖分类
  11. 106短信平台如何申请?申请周期是多久?
  12. VBA批量导入多个文件夹下的图片到PPT
  13. wap,WML语言与编程
  14. 浅谈团队的绩效管理机制
  15. Python简单爬取起点中文网小说(仅学习)
  16. OJB中的多表查询和更新
  17. 数据归一化、标准化和去中心化
  18. YOLOv6又快又准的目标检测框架 已开源
  19. windows下补丁手动下载和安装
  20. SAP ABAP 报表新增字段,重新生成维护视图,以及过程中产生的问题处理

热门文章

  1. 西贝柳斯打谱软件-Avid Sibelius Ultimate 2021.2 MacOSX
  2. 音箱CE认证办理标准流程介绍
  3. 转型元年 中企动力欲用云重新定义企业网站服务
  4. archlinux使用支付宝控件不正常
  5. 用c语言实现田忌赛马(贪心算法)
  6. 512卡农头接线序号
  7. 带刻度尺的日期选择器
  8. Kali Linux 安装最新版QQ
  9. 用 Kotlin 开发 Android 项目是一种什么样的感受?(二)
  10. C# 下载文件到本地(两步到位)