1、主键id的生成

数据库表里一般都会有一个主键id,来做为这条数据的惟一标识。redis

常见的方式

数据库自动增加

这种很常见了,能够作到全库惟一。由于id是自然排序的,对于涉及到排序的操做会很方便。算法

UUID

上面的自动增加,虽然简单,可是对于分表这样的操做来讲就比较麻烦。由于你在第二张插入数据的时候,须要拿到上一张表最后一个数据的id。

UUID则不一样,每次都一个随机惟一的值,不过由于是随机,因此也就没有排序了。spring

redis

redis也能够用来生成id,利用redis的原子操做。好处是能够不依赖数据库,性能好,可是随之由于redis的引入,带来了必定的复杂度。数据库

mybatis-plus的方式

其实在以前使用mp进行新增数据的时候,我并无进行对应的配置,默认就会带有主键id。mybatis

对其配置也很简单,在主键上加注解,@TableId(type = IdType.ID_WORKER)app

@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。分布式

2、mp实现自动填充

在操做数据库的时候还有一种常见操做,就是一些字段的填充,好比常见的create_time、update_time等,填充方式都是相同的。

那么除了每次的手动填充,还能够自动填充。而在MP里设置自动填充只要2步便可:ide

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);

}

结果正确。

mybatisplus自动生成id_【mybatis-plus】主键id生成、字段自动填充相关推荐

  1. 分库分表的 9种分布式主键ID 生成方案

    <sharding-jdbc 分库分表的 4种分片策略> 中我们介绍了 sharding-jdbc 4种分片策略的使用场景,可以满足基础的分片功能开发,这篇我们来看看分库分表后,应该如何为 ...

  2. 分库分表的 9种分布式主键ID 生成方案,挺全乎的

    <sharding-jdbc 分库分表的 4种分片策略> 中我们介绍了 sharding-jdbc 4种分片策略的使用场景,可以满足基础的分片功能开发,这篇我们来看看分库分表后,应该如何为 ...

  3. JPA 主键ID生成策略

    在定义Entity的ID字段时,我们可以使用@GeneratedValue注解指定以何种方式生成数据库的主键ID的值.有几种策略: 1. 默认情况下,是自动生成策略. 比如下边两种方式效果是一样的.如 ...

  4. java id主键_JAVA主键ID生成工具类:改自twitter的分布式ID算法snowflake

    祝大家新年快乐,有任何问题可与我联系: 关于snowflake算法的介绍和原理这里不过多说明了,网上有很多. 这里简单描述下SnowflakeUtil的优点: 1.做为底层工具使用,可用于数据库主键. ...

  5. Mybatis根据IdType生成不同类型的主键id

    IdType是一个枚举类,定义了生成ID的类型 AUTO 数据库ID自增 INPUT 用户输入ID ID_WORKER 全局唯一ID,Long类型的主键 ID_WORKER_STR 字符串全局唯一ID ...

  6. MySQL之主键ID生成策略

    5种全局ID生成方式.优缺点及改进方案 全局唯一id特点: 1.数据库自增长序列或字段生成id 2.UUID 3.Redis生成ID 4.zookeeper生成ID 5.Twitter的snowfla ...

  7. 如何用分库分表的9种分布式主键ID生成方案?完整PDF

    前言 前段时间,我向一位在阿里的朋友寻求进大厂的秘诀,他分享给我一份阿里内部资料--JAVA核心进阶手册,仔细翻阅一番才知道里面收纳整理的知识可真是齐全,不得不来感叹一番- 我将JAVA核心进阶手册大 ...

  8. 如何用分库分表的9种分布式主键ID生成方案?附小技巧

    1. 前言 大家都知道,Postman是一个非常受欢迎的API接口调试工具,提供有Chrome扩展插件版和独立的APP,不过它的很多高级功能都需要付费才能使用. 如果你连Postman都还没有用过,不 ...

  9. 数据库的主键ID设置为自动增加,删除记录后的记录还是递增的,如何重新从1开始增加呢?

    操作 数据库数据 删除了7和8之后添加了一条新数据 问题 删除记录后的记录还是递增的,如何重新从1开始增加呢? 解决 truncate table 表名; 注意 此语句会把表中数据清空

  10. 通过源码分析Mybatis是如何返回数据库生成的自增主键值?

    在Mybatis中,执行insert操作时,如果我们希望返回数据库生成的自增主键值,那么就需要使用到KeyGenerator对象. 需要注意的是,KeyGenerator的作用,是返回数据库生成的自增 ...

最新文章

  1. VMware 虚拟化编程(5) — VixDiskLib 虚拟磁盘库详解之一
  2. Eclipse中CVS版本管理
  3. java:栈空间,堆空间,方法区
  4. Memcached - In Action
  5. android layerlist bitmap,android shape类似的 另一个 高端用法:layer-list
  6. pyhton 面向对象(下)
  7. 【正则化】各种Dropout方法
  8. 20162303 实验二 树
  9. 详解display:inline | block |inline-block的区别(转)
  10. bootstrap创建响应式网站
  11. Windows Xp Sp3简体中文补丁包下载地址
  12. php实现mkv视频播放,mkv怎么合并视频文件
  13. 你还在纠结英语的发音问题吗,你还老记不住单词吗?
  14. linux安装mysql菜鸟教程_[新手教程]Linux环境部署MYSQL过程
  15. 时钟晶振电路EMC设计标准电路详解
  16. 技术分享 | 如何实现小程序与 App 的跳转
  17. html做成小程序,HTML-简单表单制作-表单制作-小程序表单制作
  18. Antlr4 区分“减号”运算符和负号
  19. [Linux 基础] -- 驱动调试神器 printk 你掌握了吗?
  20. 电脑分区硬盘分区怎么操作?

热门文章

  1. simulink仿真实例_推荐几本关于制冷仿真的书籍(制冷仿真必备)
  2. python三菱fx3u通讯mx_[实例]三菱FX3U-485无协议通讯程序(含程序段)
  3. win10很多软件显示模糊_win10系统字体模糊的解决方法
  4. d7100 远程控制拍照(无线,有线,手机,电脑,路由器)
  5. ICLR 2022 | 合作博弈新范式:为可解释性等机器学习估值问题提供新方法
  6. 安卓开发之WebView的使用
  7. 初中计算机授课教案模板,初中课程教案模板
  8. 零基础入门STM32编程——工具篇(四)
  9. RTC唤醒低功耗(standby)模式
  10. PSF 点扩展函数 (from WikiPedia)