美文网首页
Mybatis-Plus:CRUD拓展系列(主键生成策略,自动填

Mybatis-Plus:CRUD拓展系列(主键生成策略,自动填

作者: 掌灬纹 | 来源:发表于2021-01-17 18:39 被阅读0次

    1.常用主键生成策略

    Mybatis-Plus:常用的主键增长策略:1.默认IdType.ID_WORKER--基于雪花算法实现的用户唯一id生成策略;2.IdType.AUTO--自动增长策略

    • @TableId 注解的使用:顾名思义,这个注解标注实体类中字段对应数据库中表的主键字段;当使用默认策略(雪花算法)特别注意自动生成主键是Long型;当使用AUTO自动增长策略,要注意数据库设计中主键列也必需为自动增长
    • 默认策略
        // 默认全局唯一id 雪花算法自动生成(默认) 
        @TableId(type = IdType.ID_WORKER)
        private Long id;
    
    • 自动增长
        // AUTO: 自动增长
        @TableId(type = IdType.AUTO)
        private Long id;
    
    ` 主键自动增长

    2.自动填充插件

    前言:阿里开发手册中提及数据库建表所有表中需包含:gmt_create(记录创建时间) 和 gmt_modified(记录修改时间)两个字段,这两个字段应该是自动化添加修改

    • 实体类字段中添加 @TableField 注解
        // 字段在 插入时操作
        @TableField(fill = FieldFill.INSERT)
        private Date gmtCreate;
    
        // 字段在 插入和更新时 操作
        @TableField(fill = FieldFill.INSERT_UPDATE)
        private Date gmtModified;
    
    • 编写源数据处理器 实现 MetaObjectHandler 注意注入ioc容器中
    package com.ht.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 // 将处理器 加入 ioc容器中 Spring托管
    public class MyMetaObjectHandler implements MetaObjectHandler {
    
        // 插入数据时的策略
        @Override
        public void insertFill(MetaObject metaObject) {
            log.info("插入数据处理: ......");
            // 为字段填充值 实体类字段名 值
            this.setFieldValByName("gmtCreate",new Date(),metaObject);
            this.setFieldValByName("gmtModified",new Date(),metaObject);
        }
    
        // 更新数据时的策略
        @Override
        public void updateFill(MetaObject metaObject) {
            log.info("更新数据处理: ......");
            // 为字段更新值
            this.setFieldValByName("gmtModified",new Date(),metaObject);
        }
    }
    
    前端展示

    3.乐观锁处理

    前言:乐观锁,对任何操作不加锁处理,直到出现问题再次更新测试,具体实现参照官网

    • 进一步解释乐观锁处理过程:
      1.先查询 获得当前版本号
      2.执行更新时 要 带入version,只有当前更新记录的版本号 与 第一步查询的版本号一致时 才可以更新
      3.如果 第一步version 与 第二步 version不一致 更新失败
      4.执行更新 版本号 改变+1

    实际操作:即实现线程安全;A线程 更新一条记录;在执行过程中 B线程率先完成更新记录(版本号改变);此时A线程第一步查询的版本号 与 当前要更新记录的版本号 已经不一致更新失败。

    • 实体类 版本号字段增加 @version注解
        // 乐观锁 处理 版本号
        @Version
        private Integer version;
    
    • 编写配置类 注册乐观锁插件
    package com.ht.config;
    
    import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor;
    import org.mybatis.spring.annotation.MapperScan;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.transaction.annotation.EnableTransactionManagement;
    
    @Configuration // 配置类
    @EnableTransactionManagement // 开启事务
    @MapperScan("com.ht.mapper") // 扫描Mapper
    public class MyBatisPlusConfig {
        // 注册乐观锁插件 拦截器
        @Bean
        public OptimisticLockerInterceptor optimisticLockerInterceptor(){
            return new OptimisticLockerInterceptor();
        }
    }
    

    ~ 后续:结合前端借用Mybatis-Plus中的分页插件 实现分页查询...

    ~ 实现效果: 记录分页-1 记录分页-2

    相关文章

      网友评论

          本文标题:Mybatis-Plus:CRUD拓展系列(主键生成策略,自动填

          本文链接:https://www.haomeiwen.com/subject/celnaktx.html