mybatis-plus IdWorker生成的Id和返回给前台的不一致的解决

 更新时间:2021年03月05日 10:31:49   作者:唯学习方能解忧  
这篇文章主要介绍了mybatis-plus IdWorker生成的Id和返回给前台的不一致的解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

问题描述

今天在公司项目中修改id的生成策略为mybatis-plus自带的IdWorker策略时,发现返回给前台的id竟然和数据库不一致。费解得很呐。

package net.mshome.twisted.tmall.entity;

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;
import java.time.LocalDateTime;

/**
 * 数据库实体类的父类,必需字段
 *
 * @author tangjizhouchn@foxmail.com
 * @date 2019/9/6
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class BaseEntity implements Serializable {

  private static final long serialVersionUID = 236424297319280526L;

  /**
   * 数据表主键,此处采用mybatis-plus自带的IdType.ID_WORKER策略
   */
  @TableId(value = "id", type = IdType.ID_WORKER)
  protected Long id;

  /**
   * 数据创建时间
   */
  @TableField(fill = FieldFill.INSERT)
  protected LocalDateTime createTime;
  /**
   * 数据更新时间
   */
  @TableField(fill = FieldFill.INSERT_UPDATE)
  protected LocalDateTime updateTime;
}
  1. @TableId(value = "id", type = IdType.ID_WORKER)表示通过mybatis-plus自带的优化版本的SnowFlake算法生成主键。
  2. 关于主键生成方式,可以看看这个类 com.baomidou.mybatisplus.core.toolkit.IdWorker

问题原因

mybatis-plus的ID_WORKER策略会生成一个Long型的很长长长长的数字,这个数字传到前台之后,超过了js中数字的最大范围,具体表现为最后两位始终为 0。

解决办法

很容易想到,超过了js数字最大范围,那直接转成String类型就完了。

方案一(适合BaseEntity方式)

package net.mshome.twisted.tmall.entity;

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;
import java.time.LocalDateTime;

/**
 * 数据库实体类的父类,必需字段
 *
 * @author tangjizhouchn@foxmail.com
 * @date 2019/9/6
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class BaseEntity implements Serializable {

  private static final long serialVersionUID = 236424297319280522L;

  /**
   * 数据表主键
   */
  @TableId(value = "id", type = IdType.ID_WORKER)
  @JsonSerialize(using = ToStringSerializer.class)
  protected Long id;

  /**
   * 数据创建时间
   */
  @TableField(fill = FieldFill.INSERT)
  protected LocalDateTime createTime;
  /**
   * 数据更新时间
   */
  @TableField(fill = FieldFill.INSERT_UPDATE)
  protected LocalDateTime updateTime;

}

添加 @JsonSerialize(using = ToStringSerializer.class)将结果转换成String。

此方案适合有baseEntity的时候,避免每个entity都要单独维护,很麻烦。

方案二(全局处理-两种方式)

package net.mshome.twisted.tmall.configuration;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

/**
 * 系统通用简单配置
 *
 * @author tangjizhouchn@foxmail.com
 * @date 2019/10/16
 */
@Configuration
public class TmallConfiguration {

  /**
   * 方式一:此方式可以灵活配置任意类型的序列化反序列化
   */
  @Bean
  public Jackson2ObjectMapperBuilderCustomizer builderCustomizer() {
    DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
    DateTimeFormatter dateTimeSerializeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
    DateTimeFormatter dateTimeDeserializeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
    return builder -> {
      // 所有Long类型转换成String到前台
      builder.serializerByType(Long.class, ToStringSerializer.instance);
      builder.serializerByType(LocalDate.class, new LocalDateSerializer(dateFormatter));
      builder.serializerByType(LocalDateTime.class, new LocalDateTimeSerializer(dateTimeSerializeFormatter));
      builder.deserializerByType(LocalDateTime.class, new LocalDateTimeDeserializer(dateTimeDeserializeFormatter));
    };
  }

  /**
   *
   * 方式二:采用objectMapper注入
   */
  @Bean
  public ObjectMapper objectMapper (Jackson2ObjectMapperBuilder builder) {
    ObjectMapper objectMapper = builder.createXmlMapper(false).build();
    SimpleModule simpleModule = new SimpleModule();
    // 直接将所有的Long类型转换为String
    simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
    simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance);
    objectMapper.registerModule(simpleModule);
    return objectMapper;
  }
}

直接将所有的Long类型转换为String给前台展示。后台用Long接收前台传入的数字String也可以的,Spring会自动给我们转换。

到此这篇关于mybatis-plus IdWorker生成的Id和返回给前台的不一致的解决的文章就介绍到这了,更多相关mybatis-plus IdWorker生成Id内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java 如何安全的发布对象

    Java 如何安全的发布对象

    这篇文章主要介绍了Java 如何安全的发布对象,帮助大家更好的理解和使用Java,感兴趣的朋友可以了解下
    2021-01-01
  • Java中的自旋锁spinlock详解

    Java中的自旋锁spinlock详解

    这篇文章主要介绍了Java中的自旋锁spinlock详解,自旋锁就是循环尝试获取锁,不会放弃CPU时间片,减伤cup上下文切换,缺点是循环会消耗cpu,需要的朋友可以参考下
    2024-01-01
  • java实现抢红包算法(公平版和手速版)

    java实现抢红包算法(公平版和手速版)

    这篇文章主要为大家详细介绍了java实现抢红包算法,分为公平版和手速版,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-09-09
  • Springmvc拦截器执行顺序及各方法作用详解

    Springmvc拦截器执行顺序及各方法作用详解

    这篇文章主要介绍了Springmvc的拦截器执行顺序及各方法作用,下面讲实现其接口的写法,先看一下这个接口的三个方法,需要的朋友可以参考下
    2018-07-07
  • java虚拟机参数-D、-X和-XX的区别小结

    java虚拟机参数-D、-X和-XX的区别小结

    本文主要介绍了java虚拟机参数-D、-X和-XX的区别小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • JavaWeb文件上传入门教程

    JavaWeb文件上传入门教程

    这篇文章主要为大家详细介绍了JavaWeb文件上传入门教程,分析了文件上传原理、介绍了第三方上传组件,感兴趣的小伙伴们可以参考一下
    2016-06-06
  • SpringBoot整合阿里云OSS对象存储服务的实现

    SpringBoot整合阿里云OSS对象存储服务的实现

    这篇文章主要介绍了SpringBoot整合阿里云OSS对象存储服务的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • 使用java执行定时任务示例

    使用java执行定时任务示例

    这篇文章主要介绍了使用java执行定时任务示例,需要的朋友可以参考下
    2014-04-04
  • 基于Java编写简单的Excel工具类

    基于Java编写简单的Excel工具类

    这篇文章主要为大家详细介绍了如何基于Java编写简单的Excel工具类,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考下
    2024-02-02
  • MybatisPlus调用原生SQL的实现方法

    MybatisPlus调用原生SQL的实现方法

    本文主要介绍了MybatisPlus调用原生SQL的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02

最新评论