百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分类 > 正文

「mybatis-plus」主键id生成、字段自动填充

ztj100 2025-01-06 16:30 28 浏览 0 评论

一、主键id的生成

数据库表里通常都会有一个主键id,来作为这条数据的唯一标识。

常见的方式

  1. 数据库自动增长这种很常见了,可以做到全库唯一。因为id是天然排序的,对于涉及到排序的操作会很方便。
  2. UUID上面的自动增长,虽然简单,但是对于分表这样的操作来说就比较麻烦。因为你在第二张插入数据的时候,需要拿到上一张表最后一个数据的id。UUID则不同,每次都一个随机唯一的值,不过因为是随机,所以也就没有排序了。
  3. redisredis也可以用来生成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
ID_WORKER
ID_WORKer_STR

关于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);
    }

结果正确。

来源:https://www.tuicool.com/articles/fqAja2R

相关推荐

其实TensorFlow真的很水无非就这30篇熬夜练

好的!以下是TensorFlow需要掌握的核心内容,用列表形式呈现,简洁清晰(含表情符号,<300字):1.基础概念与环境TensorFlow架构(计算图、会话->EagerE...

交叉验证和超参数调整:如何优化你的机器学习模型

准确预测Fitbit的睡眠得分在本文的前两部分中,我获取了Fitbit的睡眠数据并对其进行预处理,将这些数据分为训练集、验证集和测试集,除此之外,我还训练了三种不同的机器学习模型并比较了它们的性能。在...

机器学习交叉验证全指南:原理、类型与实战技巧

机器学习模型常常需要大量数据,但它们如何与实时新数据协同工作也同样关键。交叉验证是一种通过将数据集分成若干部分、在部分数据上训练模型、在其余数据上测试模型的方法,用来检验模型的表现。这有助于发现过拟合...

深度学习中的类别激活热图可视化

作者:ValentinaAlto编译:ronghuaiyang导读使用Keras实现图像分类中的激活热图的可视化,帮助更有针对性...

超强,必会的机器学习评估指标

大侠幸会,在下全网同名[算法金]0基础转AI上岸,多个算法赛Top[日更万日,让更多人享受智能乐趣]构建机器学习模型的关键步骤是检查其性能,这是通过使用验证指标来完成的。选择正确的验证指...

机器学习入门教程-第六课:监督学习与非监督学习

1.回顾与引入上节课我们谈到了机器学习的一些实战技巧,比如如何处理数据、选择模型以及调整参数。今天,我们将更深入地探讨机器学习的两大类:监督学习和非监督学习。2.监督学习监督学习就像是有老师的教学...

Python教程(三十八):机器学习基础

...

Python 模型部署不用愁!容器化实战,5 分钟搞定环境配置

你是不是也遇到过这种糟心事:花了好几天训练出的Python模型,在自己电脑上跑得顺顺当当,一放到服务器就各种报错。要么是Python版本不对,要么是依赖库冲突,折腾半天还是用不了。别再喊“我...

超全面讲透一个算法模型,高斯核!!

...

神经网络与传统统计方法的简单对比

传统的统计方法如...

AI 基础知识从0.1到0.2——用“房价预测”入门机器学习全流程

...

自回归滞后模型进行多变量时间序列预测

下图显示了关于不同类型葡萄酒销量的月度多元时间序列。每种葡萄酒类型都是时间序列中的一个变量。假设要预测其中一个变量。比如,sparklingwine。如何建立一个模型来进行预测呢?一种常见的方...

苹果AI策略:慢哲学——科技行业的“长期主义”试金石

苹果AI策略的深度原创分析,结合技术伦理、商业逻辑与行业博弈,揭示其“慢哲学”背后的战略智慧:一、反常之举:AI狂潮中的“逆行者”当科技巨头深陷AI军备竞赛,苹果的克制显得格格不入:功能延期:App...

时间序列预测全攻略,6大模型代码实操

如果你对数据分析感兴趣,希望学习更多的方法论,希望听听经验分享,欢迎移步宝藏公众号...

AI 基础知识从 0.4 到 0.5—— 计算机视觉之光 CNN

...

取消回复欢迎 发表评论: