自动生成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; }
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;
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); } }
雪花算法自动生成主键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。