MybatisPlus主键生成策略与自动填充

目录

 主键生成策略

  自动填充

方式一:数据库级别

方式二:代码控制级别(常用)


 主键生成策略

  • 数据库自增长
  • 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);
    }

 运行结果

猜你喜欢

转载自blog.csdn.net/weixin_60719453/article/details/127771997