目录
主键生成策略
- 数据库自增长
- UUID
- Redis生成id
- snowflake(雪花算法)
snowflake是Twitter开源的分布式ID生成算法,结果是一个long型的ID。其核心思想是:使用41bit作为毫秒数,10bit作为机器的ID(5个bit是数据中心,5个bit的机器ID),12bit作为毫秒内的流水号(意味着每个节点在每毫秒可以产生 4096 个 ID),最后还有一个符号位,永远是0
mybatisplus的主键生成策略就是采用这种雪花算法方式
测试插入
@Test
void insert() {
User user = new User();
user.setName("kc");
user.setAge(18);
user.setEmail("[email protected]");
userMapper.insert(user);
}
配置主键自增
在实体类对象中配置,前提是数据库表中也是设置自增的
@Data
public class User {
@TableId(type = IdType.AUTO)
private Long id;
private String name;
private Integer age;
private String email;
}
IdType源码
public enum IdType {
AUTO(0),数据库id自增
NONE(1),未设置主键
INPUT(2),手动输入
ID_WORKER(3),默认的全局唯一id
ID_WORKER_STR(3), ID_WORKER字符串表示法
UUID(4);//全局唯一id uuid
}
自动拼接动态sql
自动填充
创建时间、修改时间,这些操作一般都是自动化完成的,不希望手动更新。
阿里巴巴开发手册:一般所有的数据库表:都要配上gmt_create、gmt_modified这两个字段,而且需要自动化。
方式一:数据库级别
在数据库表中新增这两个字段,默认值为CURRENT_TIMESTAMP,表示当前时间
方式二:代码控制级别(常用)
数据库表通常是不能够修改的,在代码中使用自动填充
首先在对象上添加 @TableField字段
import java.util.Date;
@Data
public class User {
@TableId(type = IdType.AUTO)
private Long id;
private String name;
private Integer age;
private String email;
@TableField(fill = FieldFill.INSERT)//插入的时候执行
private Date creatTime;
@TableField(fill = FieldFill.INSERT_UPDATE)//插入和更新时执行
private Date updateTime;
}
然后自定义实现类 MyMetaObjectHandler,好让spring识别并做出处理
package com.handler;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.util.Date;
@Slf4j
@Component//得交给spring容器管理
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
log.info("start insert fill...");
//setFieldValByName(String fieldName, Object fieldVal, MetaObject metaObject)
this.setFieldValByName("creatTime", new Date(),metaObject);
this.setFieldValByName("updateTime", new Date(),metaObject);
}
@Override
public void updateFill(MetaObject metaObject) {
log.info("start update fill...");
this.setFieldValByName("updateTime", new Date(),metaObject);
}
}
测试插入
@Test
void insert() {
User user = new User();
user.setName("autoInertTest");
user.setAge(123);
user.setEmail("[email protected]");
userMapper.insert(user);
}
运行结果
测试更新
@Test
void update() {
User user = new User();
user.setId(5L);
user.setName("kongchaoAfter");
user.setAge(1222);
user.setEmail("[email protected]");
userMapper.updateById(user);
}
运行结果