自动生成id

 

参考:

https://mp.baomidou.com/guide/id-generator.html

一般自动生成修改数据库字段方法

1、数据库实体类

对于主键来说
@TableId(value = "REFID",type = IdType.ID_WORKER_STR)
private String refid;

复制代码
package com.uih.servicecenter.common.entity;

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import java.io.Serializable;
import java.sql.Timestamp;

/**
 * @ClassName: BaseEntity
 * @Description: 基础实体类
 * @Author: liang.yan@united-imging.com
 * @date: 2019/8/15
 *
 *
 */
@Data
public class BaseEntity implements Serializable {
    private static final long serialVersionUID = 7732699947578613249L;
    /**
     * 主键
     */
    @TableId(value = "REFID",type = IdType.ID_WORKER_STR)
    private String refid;
    /**
     *createUserRefid 创建者关联id
     */
    @TableField(value = "CREATE_USER_REFID",fill = FieldFill.INSERT)
    private String createUserRefid;

    /**
     *createDateTime 创建时间
     */
    @TableField(value = "CREATE_DATETIME",fill = FieldFill.INSERT)
    private Timestamp createDatetime;

    /**
     *modifyUserRefid 修改者关联id
     */
    @TableField(value = "MODIFY_USER_REFID",fill = FieldFill.UPDATE)
    private String modifyUserRefid;

    /**
     *modifyDateTime 修改时间
     */
    @TableField(value = "MODIFY_DATETIME", fill = FieldFill.INSERT_UPDATE)
    private Timestamp modifyDatetime;

    /**
     *version 版本号
     */
    @TableField(value = "VERSION")
    private Integer version;

    /**
     * 是否有效
     */
    @TableField(value = "ACTIVE",fill = FieldFill.INSERT)
    private Integer active;

    /**
     *  deleted 删除状态
     */
    @TableField(value = "DELETED",fill = FieldFill.INSERT)
    private Integer deleted;
}
View Code
复制代码

2、数据库字段

复制代码
CREATE TABLE `device_info` (
`REFID` varchar(32) NOT NULL,
`ACTIVE` tinyint(1) DEFAULT NULL,
`DELETED` tinyint(1) DEFAULT NULL,
`CREATE_USER_REFID` varchar(32) DEFAULT NULL,
`CREATE_DATETIME` datetime DEFAULT NULL,
`MODIFY_USER_REFID` varchar(32) DEFAULT NULL,
`MODIFY_DATETIME` datetime DEFAULT NULL,
`VERSION` smallint(6) DEFAULT NULL,
PRIMARY KEY (`REFID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
View Code
复制代码

3、配置

复制代码
package com.uih.servicecenter.common.config;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;

import java.sql.Timestamp;

/**
* @ClassName: MyMetaObjectHandler
* @Description: 设置数据库字段的字段填充
* @Author: liang.yan@united-imging.com
* @date: 2019/9/16
*
*
*/
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
this.setFieldValByName("createDatetime",new Timestamp(System.currentTimeMillis()),metaObject);
this.setFieldValByName("modifyDatetime",new Timestamp(System.currentTimeMillis()),metaObject);
this.setFieldValByName("active",1,metaObject);
this.setFieldValByName("deleted",0,metaObject);
}

@Override
public void updateFill(MetaObject metaObject) {
this.setFieldValByName("modifyDatetime",new Timestamp(System.currentTimeMillis()),metaObject);
}
}
View Code
复制代码

雪花算法自动生成主键id

https://blog.csdn.net/weixin_38657051/article/details/94713695

概述
分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。

有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。

而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移到Cassandra,因为Cassandra没有顺序ID生成机制,所以开发了这样一套全局唯一ID生成服务。

结构
snowflake的结构如下(每部分用-分开):

0 - 0000000000 0000000000 0000000000 0000000000 0 - 00000 - 00000 - 000000000000

第一位为未使用,
接下来的41位为毫秒级时间(41位的长度可以使用69年),
然后是5位datacenterId和5位workerId(10位的长度最多支持部署1024个节点) ,
最后12位是毫秒内的计数(12位的计数顺序号支持每个节点每毫秒产生4096个ID序号)

一共加起来刚好64位,为一个Long型。(转换成字符串后长度最多19)

snowflake生成的ID整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和workerId作区分),并且效率较高。经测试snowflake每秒能够产生26万个ID。

 

posted @   弱水三千12138  阅读(1040)  评论(0编辑  收藏  举报
(评论功能已被禁用)
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· .NET Core 中如何实现缓存的预热?
· 三行代码完成国际化适配,妙~啊~
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
点击右上角即可分享
微信分享提示