自动生成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 @ 2019-11-28 22:11  弱水三千12138  阅读(1033)  评论(0编辑  收藏  举报