飞道的博客

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

442人阅读  评论(0)

目录

 主键生成策略

  自动填充

方式一:数据库级别

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


 主键生成策略

  • 数据库自增长
  • UUID
  • Redis生成id
  • snowflake(雪花算法)

snowflake是Twitter开源的分布式ID生成算法,结果是一个long型的ID。其核心思想是:使用41bit作为毫秒数,10bit作为机器的ID(5个bit是数据中心,5个bit的机器ID),12bit作为毫秒内的流水号(意味着每个节点在每毫秒可以产生 4096 个 ID),最后还有一个符号位,永远是0

mybatisplus的主键生成策略就是采用这种雪花算法方式

测试插入


  
  1. @Test
  2. void insert () {
  3. User user = new User();
  4. user.setName( "kc");
  5. user.setAge( 18);
  6. user.setEmail( "123@qq.com");
  7. userMapper.insert(user);
  8. }

 配置主键自增

实体类对象中配置,前提是数据库表中也是设置自增的


  
  1. @Data
  2. public class User {
  3. @TableId(type = IdType.AUTO)
  4. private Long id;
  5. private String name;
  6. private Integer age;
  7. private String email;
  8. }

IdType源码


  
  1. public enum IdType {
  2. AUTO( 0),数据库id自增
  3. NONE( 1),未设置主键
  4. INPUT( 2),手动输入
  5. ID_WORKER( 3),默认的全局唯一id
  6. ID_WORKER_STR (3), ID_WORKER字符串表示法
  7. UUID( 4); //全局唯一id uuid
  8. }

自动拼接动态sql 

  自动填充

创建时间、修改时间,这些操作一般都是自动化完成的,不希望手动更新。

阿里巴巴开发手册:一般所有的数据库表:都要配上gmt_create、gmt_modified这两个字段,而且需要自动化。

方式一:数据库级别

在数据库表中新增这两个字段,默认值为CURRENT_TIMESTAMP,表示当前时间

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

数据库表通常是不能够修改的,在代码中使用自动填充

首先在对象上添加   @TableField字段


  
  1. import java.util.Date;
  2. @Data
  3. public class User {
  4. @TableId(type = IdType.AUTO)
  5. private Long id;
  6. private String name;
  7. private Integer age;
  8. private String email;
  9. @TableField(fill = FieldFill.INSERT) //插入的时候执行
  10. private Date creatTime;
  11. @TableField(fill = FieldFill.INSERT_UPDATE) //插入和更新时执行
  12. private Date updateTime;
  13. }

然后自定义实现类 MyMetaObjectHandler,好让spring识别并做出处理


  
  1. package com.handler;
  2. import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
  3. import lombok.extern.slf4j.Slf4j;
  4. import org.apache.ibatis.reflection.MetaObject;
  5. import org.springframework.stereotype.Component;
  6. import java.util.Date;
  7. @Slf4j
  8. @Component //得交给spring容器管理
  9. public class MyMetaObjectHandler implements MetaObjectHandler {
  10. @Override
  11. public void insertFill (MetaObject metaObject) {
  12. log.info( "start insert fill...");
  13. //setFieldValByName(String fieldName, Object fieldVal, MetaObject metaObject)
  14. this.setFieldValByName( "creatTime", new Date(),metaObject);
  15. this.setFieldValByName( "updateTime", new Date(),metaObject);
  16. }
  17. @Override
  18. public void updateFill (MetaObject metaObject) {
  19. log.info( "start update fill...");
  20. this.setFieldValByName( "updateTime", new Date(),metaObject);
  21. }
  22. }

测试插入


  
  1. @Test
  2. void insert () {
  3. User user = new User();
  4. user.setName( "autoInertTest");
  5. user.setAge( 123);
  6. user.setEmail( "12133@qq.com");
  7. userMapper.insert(user);
  8. }

运行结果 

测试更新 


  
  1. @Test
  2. void update () {
  3. User user = new User();
  4. user.setId( 5L);
  5. user.setName( "kongchaoAfter");
  6. user.setAge( 1222);
  7. user.setEmail( "nono@qq.com");
  8. userMapper.updateById(user);
  9. }

 运行结果


转载:https://blog.csdn.net/weixin_60719453/article/details/127771997
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场