mybatis-plus主键id生成、字段自动填充的实现代码

 更新时间:2020年12月26日 09:56:13   作者:把苹果v咬哭  
这篇文章主要介绍了mybatis-plus主键id生成、字段自动填充的实现代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

一、主键id的生成

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

常见的方式

1.数据库自动增长
这种很常见了,可以做到全库唯一。因为id是天然排序的,对于涉及到排序的操作会很方便。

2.UUID
上面的自动增长,虽然简单,但是对于分表这样的操作来说就比较麻烦。因为你在第二张插入数据的时候,需要拿到上一张表最后一个数据的id。
UUID则不同,每次都一个随机唯一的值,不过因为是随机,所以也就没有排序了。

3.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类型的主键id
  • ID_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_timeupdate_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生成、字段自动填充的实现代码的文章就介绍到这了,更多相关mybatis-plus主键id自动填充内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Spring事务管理方法步骤解析

    Spring事务管理方法步骤解析

    这篇文章主要介绍了Spring事务管理方法步骤解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09
  • 基于spring security实现登录注销功能过程解析

    基于spring security实现登录注销功能过程解析

    这篇文章主要介绍了基于spring security实现登录注销功能过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-01-01
  • MyBatis如何进行双重foreach循环

    MyBatis如何进行双重foreach循环

    这篇文章主要介绍了MyBatis如何进行双重foreach循环,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • Java数组判断是否越界的示例代码

    Java数组判断是否越界的示例代码

    在Java编程中,避免数组越界是十分重要的,本文介绍了两种常见的判断数组是否越界的方法:一是通过数组的length属性来判断索引是否合法;二是通过捕获ArrayIndexOutOfBoundsException异常来处理越界问题,感兴趣的朋友跟随小编一起看看吧
    2024-09-09
  • Java LinkedList集合功能实例解析

    Java LinkedList集合功能实例解析

    这篇文章主要介绍了Java LinkedList集合功能实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • java中Javers 比较两个类的差异

    java中Javers 比较两个类的差异

    本文主要介绍了Javers 比较两个类的差异,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • 解析SpringBoot 搭建基于 MinIO 的高性能存储服务的问题

    解析SpringBoot 搭建基于 MinIO 的高性能存储服务的问题

    Minio是Apache License v2.0下发布的对象存储服务器,使用MinIO构建用于机器学习,分析和应用程序数据工作负载的高性能基础架构。这篇文章主要介绍了SpringBoot 搭建基于 MinIO 的高性能存储服务,需要的朋友可以参考下
    2022-03-03
  • mybatis参数String与Integer类型的判断方式

    mybatis参数String与Integer类型的判断方式

    这篇文章主要介绍了mybatis参数String与Integer类型的判断方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • 浅谈Java中ThreadLocal内存泄露的原因及处理方式

    浅谈Java中ThreadLocal内存泄露的原因及处理方式

    内存泄漏就是我们申请了内存,但是该内存一直无法释放,就会导致内存溢出问题,本文详细的介绍了ThreadLocal内存泄露的原因及处理方式,感兴趣的可以了解一下
    2023-05-05
  • SpringBoot实现PDF添加水印的三种方法

    SpringBoot实现PDF添加水印的三种方法

    本文主要介绍了SpringBoot实现PDF添加水印的三种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07

最新评论