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


    目录

     主键生成策略

      自动填充

    方式一:数据库级别

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


     主键生成策略

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

     运行结果

  • 相关阅读:
    ORACLE的utl_raw函数在不同字符集的数据库中的用法
    Prometheus入门与实战
    待抓取位姿转换到世界坐标系下
    清空一下问题机器的ClickOnce cache
    react中的函数式组件和类式组件
    App测试入门
    nginx配置之温故而知新
    【ARM】中断的处理
    华为云HECS云服务器docker环境下安装nginx
    【Oauth2】四、OAuth2AuthorizationRequestRedirectFilter
  • 原文地址:https://blog.csdn.net/weixin_60719453/article/details/127771997