【mybatis-plus】主键id生成、字段自动填充
一、主键id的生成
数据库表里通常都会有一个主键id,来作为这条数据的唯一标识。
常见的方式
数据库自动增长
这种很常见了,可以做到全库唯一。因为id是天然排序的,对于涉及到排序的操作会很方便。UUID
上面的自动增长,虽然简单,但是对于分表这样的操作来说就比较麻烦。因为你在第二张插入数据的时候,需要拿到上一张表最后一个数据的id。
UUID则不同,每次都一个随机唯一的值,不过因为是随机,所以也就没有排序了。redis
redis也可以用来生成id,利用redis的原子操作。好处是可以不依赖数据库,性能好,但是随之因为redis的引入,带来了一定的复杂度。
mybatis-plus的方式
其实在之前使用mp进行新增数据的时候,我并没有进行对应的配置,默认就会带有主键id。
对其配置也很简单,在主键上加注解,@TableId(type = IdType.ID_WORKER)
@Data
public class User {
@TableId(type = IdType.ID_WORKER)
private Long id;
private String name;
private Integer age;
private String email;
@TableField(fill = FieldFill.INSERT)
private Date createTime;
@TableField(fill = FieldFill.INSERT_UPDATE) // 新增的时候update也有值
private Date updateTime;
}
在idea编辑器里,可以按住ctrl+鼠标左击,看到IdType
的几个枚举值。
AUTO
:就是利用数据库自增了NONE
:未设置,需要手动设置值INPUT
: 需要手动设置值UUID
:生成UUID类型的主键idID_WORKER
:生成19位的值,数字类型ID_WORKer_STR
:生成19位的值,字符串类型
关于mp的这个19位值的生成,可以做个了解,利用了snowflake算法。
snowflake是Twitter开源的分布式ID生成算法,结果是一个long型的ID。
其核心思想是:使用41bit作为毫秒数,10bit作为机器的ID(5个bit是数据中心,5个bit的机器ID),
12bit作为毫秒内的流水号(意味着每个节点在每毫秒可以产生 4096 个 ID),最后还有一个符号位,永远是0。
二、mp实现自动填充
在操作数据库的时候还有一种常见操作,就是一些字段的填充,比如常见的create_time、update_time等,填充方式都是相同的。
那么除了每次的手动填充,还可以自动填充。而在MP里设置自动填充只要2步即可:
1.添加注解
@TableField(fill = FieldFill.INSERT)
、@TableField(fill = FieldFill.INSERT_UPDATE)
。
@Data
public class User {
@TableId(type = IdType.ID_WORKER)
private Long id;
private String name;
private Integer age;
private String email;
@TableField(fill = FieldFill.INSERT) // 新增的时候填充数据
private Date createTime;
@TableField(fill = FieldFill.INSERT_UPDATE) // 新增或修改的时候填充数据
private Date updateTime;
}
2.自定义实现类 MyMetaObjectHandler
这里需要我们自己写一个实现类
@Component //此注解表示 将其交给spring去管理
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
this.setFieldValByName("createTime", new Date(), metaObject);
this.setFieldValByName("updateTime", new Date(), metaObject);
}
@Override
public void updateFill(MetaObject metaObject) {
this.setFieldValByName("updateTime", new Date(), metaObject);
}
}
对了,要在数据库表里增加对应的字段create_time
、update_time
。添加后可以试一下了,先来新增一条测试数据:
// 新增
@Test
void addUser() {
User user = new User();
user.setName("老王");
user.setAge(66);
user.setEmail("laowang@123.com");
userMapper.insert(user);
}
执行成功后查看数据库表:
新增的时候,2个字段都填充了时间。
那现在只做更新操作的时候,只会去更新update_time。
// 修改
@Test
void updateUser() {
User user = new User();
user.setId(1342322873243996161L);
user.setName("老王修改后");
userMapper.updateById(user);
}
结果正确。
【mybatis-plus】主键id生成、字段自动填充的更多相关文章
- 分库分表的 9种分布式主键ID 生成方案,挺全乎的
<sharding-jdbc 分库分表的 4种分片策略> 中我们介绍了 sharding-jdbc 4种分片策略的使用场景,可以满足基础的分片功能开发,这篇我们来看看分库分表后,应该如何为 ...
- mybatis 针对SQL Server 的 主键id生成策略
SQL Server中命令: select newId() ,可以得到SQL server数据库原生的UUID值,因此我们可以将这条指令写到 Mybatis的主键生成策略配置selectKey中. ...
- 开启事务时mybatis返回主键id
先说一下没有注解的 先给出实体类: public class City { private int city_id; private String city_name; public int getC ...
- 数据库分库分表(一)常见分布式主键ID生成策略
主键生成策略 系统唯一ID是我们在设计一个系统的时候常常会遇见的问题,下面介绍一些常见的ID生成策略. Sequence ID UUID GUID COMB Snowflake 最开始的自增ID为了实 ...
- mybatis自动生成后无法获取主键id问题
使用mybatis的自动生成工具生成的主键id: <selectKey resultType="java.lang.Integer" keyProperty="id ...
- Mybatis-Plus默认主键策略导致自动生成19位长度主键id的坑
原创/朱季谦 某天检查一位离职同事写的代码,发现其对应表虽然设置了AUTO_INCREMENT自增,但页面新增功能生成的数据主键id很诡异,长度达到了19位,且不是从1开始递增的-- 我检查了一下,发 ...
- 深入浅出mybatis之返回主键ID
目录 添加单一记录时返回主键ID 在映射器中配置获取记录主键值 获取新添加记录主键字段值 添加批量记录时返回主键ID 获取主键ID实现原理 添加记录后获取主键ID,这是一个很常见的需求,特别是在一次前 ...
- mybatis与mysql插入时返回主键id的值
<insert id="insertCharge" parameterType="com.bb.bean.Rechargerecord"> < ...
- 使用mybatis插入自增主键ID的数据后返回自增的ID
在开发中碰到用户注册的功能需要用到用户ID,但是用户ID是数据库自增生成的,这种情况上网查询后使用下面的方式配置mybatis的insert语句可以解决: <insert id="in ...
随机推荐
- C语言讲义——常量(constant)
变量可以反复赋值:常量只能在定义时赋值,此后不得更改. 常量的定义需要加关键字const.如: #include <stdio.h> main() { const double PI=3. ...
- 跟阿斌一起学鸿蒙(2). Ability vs App?
在进一步实践之前,需要先弄明白一个概念:Ability. 不知道你有没有注意到,使用鸿蒙开发工具DevEco Studio创建项目时,我们选择创建的是一个个Ability. 这是为什么呢? 1. 鸿蒙 ...
- .Net Core官方的 JWT 授权验证
什么是JWT? JSON Web令牌(JWT)是一个开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间安全地传输信息作为JSON对象.由于此信息是经过数字签名的,因此可以被验 ...
- Java进阶专题(十八) 系统缓存架构设计 (下)
前言 上章节介绍了Redis相关知识,了解了Redis的高可用,高性能的原因.很多人认为提到缓存,就局限于Redis,其实缓存的应用不仅仅在于Redis的使用,比如还有Nginx缓存,缓存队列等等.这 ...
- charles功能(二)修改response请求参数
1.接口处 鼠标右击,选择breakpoints(允许本接口使用breakpionts功能) 2.开始设置断点值 4.重新请求接口(charles的界面变为可编辑状态),修改请求参数,执行请求 5.最 ...
- cf div2 round 688 题解
爆零了,自闭了 小张做项目入职字节 小李ak wf入职ms 我比赛爆零月薪3k 我们都有光明的前途 好吧,这场感觉有一点难了,昨天差点卡死在B上,要不受O爷出手相救我就boom zero了 第一题,看 ...
- 解决:com.netflix.discovery.shared.transport.TransportException: Cannot execute request on any known server
com.netflix.discovery.shared.transport.TransportException: Cannot execute request on any known serve ...
- 第7.12节 可共享的Python类变量
第7.12节 可共享的Python类变量 一. 引言 在上节已经引入介绍了类变量和实例变量,类体中定义的变量为类变量,默认属于类本身,实例变量是实例方法中定义的self对象的变量,对于每个实例都 ...
- python中的Restful
哇,昨天组里进行总结的时候,小哥哥和小姐姐真是把我给秀到了,跟他们一比,我总结的太垃圾了,嘤嘤嘤.因为我平常不怎么总结,总结的话,有word还有纸质的,现在偏向于纸质,因为可以练练字.个人观点是,掌握 ...
- python 读取目录下的文件
参考方法: import os path = r'C:\Users\Administrator\Desktop\file' for filename in os.listdir(path): prin ...