第十四章:mybatis-plus 自定义ID生成策略
在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生成策略相关推荐
- 【.NET Core项目实战-统一认证平台】第十四章 授权篇-自定义授权方式
上篇文章我介绍了如何强制令牌过期的实现,相信大家对IdentityServer4的验证流程有了更深的了解,本篇我将介绍如何使用自定义的授权方式集成老的业务系统验证,然后根据不同的客户端使用不同的认证方 ...
- 《深入理解 Spring Cloud 与微服务构建》第十四章 服务链路追踪 Spring Cloud Sleuth
<深入理解 Spring Cloud 与微服务构建>第十四章 服务链路追踪 Spring Cloud Sleuth 文章目录 <深入理解 Spring Cloud 与微服务构建> ...
- 《Dreamweaver CS6 完全自学教程》笔记 第十四章:使用 CSS 设计网页
文章目录 第十四章:使用 CSS 设计网页 14.1 CSS 样式表简介 14.2 CSS 的基本语法 14.3 伪类.伪元素以及样式表的层叠顺序 14.3.1 伪类和伪元素 14.3.2 样式表的层 ...
- Frank Luna DirectX12阅读笔记:绘制进阶(第八章-第十四章)
目录 第八章 光照 8.1 光和材质的交互 8.2 法向 8.3 光照中其他重要的向量 8.4 Lambert余弦定律 8.5 散射光(diffuse lighting) 8.6 环境光(ambien ...
- 微信小程序(第二十四章)- 数据交互前置
微信小程序(第二十四章)- 数据交互前置 讲解微信小程序前置的原因 参考文档 理解微信小程序 小程序简介 作用 提问 针对提问--uni-app介绍 小程序和普通网页开发的区别 小程序代码构成 文件个 ...
- 【正点原子Linux连载】第六十四章 Linux 多点电容触摸屏实验 -摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0
1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码+手册+视频下载地址: ...
- 鸟哥的Linux私房菜(基础篇)- 第十四章、Linux 账号管理与 ACL 权限配置
第十四章.Linux账号管理与 ACL 权限配置 最近升级日期:2009/09/09 要登陆 Linux 系统一定要有账号与口令才行,否则怎么登陆,您说是吧?不过,不同的使用者应该要拥有不同的权限才行 ...
- 谭浩强《C++程序设计》书后习题 第十三章-第十四章
2019独角兽企业重金招聘Python工程师标准>>> 最近要复习一下C和C++的基础知识,于是计划把之前学过的谭浩强的<C程序设计>和<C++程序设计>习题 ...
- fpga驱动rgb液晶屏_正点原子开拓者FPGA开发板资料连载第五十四章基于的数字识别实验...
1)实验平台:正点原子开拓者FPGA 开发板 2)摘自<开拓者FPGA开发指南>关注官方微信号公众号,获取更多资料:正点原子 3)全套实验源码+手册+视频下载地址:http://www.o ...
最新文章
- 第 28 小时项目管理过程实践和案例分析
- MCPlayerKit 0.0.6 Release
- MIT线性代数:20.克拉默法则,逆矩阵和体积
- 基于java的数据结构学习——数组实现的队列和循环队列及性能对比
- Drawable之color示例
- python代码-20个Python代码段,你需要立刻学会,好用到哭!
- volatile c语言_C语言系列文章之volatile
- ❄️全网最详细的Python入门基础教程,Python最全教程(非常详细,整理而来)
- UG NX二次开发(C#)-建模-判断一张面是孔面还是凸台面
- ISPRS2022/遥感:Cross-spatiotemporal LULC from VHR remote sensing images基于深度学习域适应的VHR遥感影像跨时空土地覆盖分类
- 106短信平台如何申请?申请周期是多久?
- VBA批量导入多个文件夹下的图片到PPT
- wap,WML语言与编程
- 浅谈团队的绩效管理机制
- Python简单爬取起点中文网小说(仅学习)
- OJB中的多表查询和更新
- 数据归一化、标准化和去中心化
- YOLOv6又快又准的目标检测框架 已开源
- windows下补丁手动下载和安装
- SAP ABAP 报表新增字段,重新生成维护视图,以及过程中产生的问题处理