亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

mybatis-plus IdWorker生成的Id和返回給前臺(tái)的不一致的解決

 更新時(shí)間:2021年03月05日 10:31:49   作者:唯學(xué)習(xí)方能解憂  
這篇文章主要介紹了mybatis-plus IdWorker生成的Id和返回給前臺(tái)的不一致的解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

問(wèn)題描述

今天在公司項(xiàng)目中修改id的生成策略為mybatis-plus自帶的IdWorker策略時(shí),發(fā)現(xiàn)返回給前臺(tái)的id竟然和數(shù)據(jù)庫(kù)不一致。費(fèi)解得很吶。

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;

/**
 * 數(shù)據(jù)庫(kù)實(shí)體類(lèi)的父類(lèi),必需字段
 *
 * @author tangjizhouchn@foxmail.com
 * @date 2019/9/6
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class BaseEntity implements Serializable {

  private static final long serialVersionUID = 236424297319280526L;

  /**
   * 數(shù)據(jù)表主鍵,此處采用mybatis-plus自帶的IdType.ID_WORKER策略
   */
  @TableId(value = "id", type = IdType.ID_WORKER)
  protected Long id;

  /**
   * 數(shù)據(jù)創(chuàng)建時(shí)間
   */
  @TableField(fill = FieldFill.INSERT)
  protected LocalDateTime createTime;
  /**
   * 數(shù)據(jù)更新時(shí)間
   */
  @TableField(fill = FieldFill.INSERT_UPDATE)
  protected LocalDateTime updateTime;
}
  1. @TableId(value = "id", type = IdType.ID_WORKER)表示通過(guò)mybatis-plus自帶的優(yōu)化版本的SnowFlake算法生成主鍵。
  2. 關(guān)于主鍵生成方式,可以看看這個(gè)類(lèi) com.baomidou.mybatisplus.core.toolkit.IdWorker

問(wèn)題原因

mybatis-plus的ID_WORKER策略會(huì)生成一個(gè)Long型的很長(zhǎng)長(zhǎng)長(zhǎng)長(zhǎng)的數(shù)字,這個(gè)數(shù)字傳到前臺(tái)之后,超過(guò)了js中數(shù)字的最大范圍,具體表現(xiàn)為最后兩位始終為 0。

解決辦法

很容易想到,超過(guò)了js數(shù)字最大范圍,那直接轉(zhuǎn)成String類(lèi)型就完了。

方案一(適合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;

/**
 * 數(shù)據(jù)庫(kù)實(shí)體類(lèi)的父類(lèi),必需字段
 *
 * @author tangjizhouchn@foxmail.com
 * @date 2019/9/6
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class BaseEntity implements Serializable {

  private static final long serialVersionUID = 236424297319280522L;

  /**
   * 數(shù)據(jù)表主鍵
   */
  @TableId(value = "id", type = IdType.ID_WORKER)
  @JsonSerialize(using = ToStringSerializer.class)
  protected Long id;

  /**
   * 數(shù)據(jù)創(chuàng)建時(shí)間
   */
  @TableField(fill = FieldFill.INSERT)
  protected LocalDateTime createTime;
  /**
   * 數(shù)據(jù)更新時(shí)間
   */
  @TableField(fill = FieldFill.INSERT_UPDATE)
  protected LocalDateTime updateTime;

}

添加 @JsonSerialize(using = ToStringSerializer.class)將結(jié)果轉(zhuǎn)換成String。

此方案適合有baseEntity的時(shí)候,避免每個(gè)entity都要單獨(dú)維護(hù),很麻煩。

方案二(全局處理-兩種方式)

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;

/**
 * 系統(tǒng)通用簡(jiǎn)單配置
 *
 * @author tangjizhouchn@foxmail.com
 * @date 2019/10/16
 */
@Configuration
public class TmallConfiguration {

  /**
   * 方式一:此方式可以靈活配置任意類(lèi)型的序列化反序列化
   */
  @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類(lèi)型轉(zhuǎn)換成String到前臺(tái)
      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類(lèi)型轉(zhuǎn)換為String
    simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
    simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance);
    objectMapper.registerModule(simpleModule);
    return objectMapper;
  }
}

直接將所有的Long類(lèi)型轉(zhuǎn)換為String給前臺(tái)展示。后臺(tái)用Long接收前臺(tái)傳入的數(shù)字String也可以的,Spring會(huì)自動(dòng)給我們轉(zhuǎn)換。

到此這篇關(guān)于mybatis-plus IdWorker生成的Id和返回給前臺(tái)的不一致的解決的文章就介紹到這了,更多相關(guān)mybatis-plus IdWorker生成Id內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 控制臺(tái)顯示java冒泡排序流程示例

    控制臺(tái)顯示java冒泡排序流程示例

    這篇文章主要介紹了控制臺(tái)顯示java冒泡排序流程示例,需要的朋友可以參考下
    2014-03-03
  • 字節(jié)碼調(diào)教入口JVM?寄生插件javaagent

    字節(jié)碼調(diào)教入口JVM?寄生插件javaagent

    這篇文章主要介紹了字節(jié)碼調(diào)教入口JVM?寄生插件javaagent方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • java基于Socket做一個(gè)簡(jiǎn)單下載器

    java基于Socket做一個(gè)簡(jiǎn)單下載器

    這篇文章主要為大家詳細(xì)介紹了java如何基于Socket制作一個(gè)簡(jiǎn)單下載器,感興趣的小伙伴們可以參考一下
    2016-08-08
  • 用StopWatch優(yōu)雅替代currentTimeMillis計(jì)算程序執(zhí)行耗時(shí)

    用StopWatch優(yōu)雅替代currentTimeMillis計(jì)算程序執(zhí)行耗時(shí)

    別再用System.currentTimeMillis()計(jì)算程序執(zhí)行耗時(shí)了,擁抱StopWatch優(yōu)雅來(lái)優(yōu)雅的計(jì)算,代碼更簡(jiǎn)潔效率更高,本文帶你了解StopWatch的使用
    2021-09-09
  • 完整詳解Java開(kāi)發(fā)學(xué)習(xí)路線指南

    完整詳解Java開(kāi)發(fā)學(xué)習(xí)路線指南

    在本篇文章里小編給大家整理的是一篇關(guān)于Java開(kāi)發(fā)學(xué)習(xí)路線以及期中的主要知識(shí)點(diǎn)內(nèi)容,有興趣的朋友么可以學(xué)習(xí)下。
    2022-11-11
  • Java線程池7個(gè)參數(shù)的含義

    Java線程池7個(gè)參數(shù)的含義

    這篇文章主要介紹了Java線程池7個(gè)參數(shù)的含義,所謂的線程池的?7?大參數(shù)是指,在使用?ThreadPoolExecutor?創(chuàng)建線程池時(shí)所設(shè)置的?7?個(gè)參數(shù),下文更多詳細(xì)內(nèi)容,需要的小伙伴可以參考一下
    2022-05-05
  • Java多線程 實(shí)例解析

    Java多線程 實(shí)例解析

    這篇文章主要介紹了Java多線程 實(shí)例解析,需要的朋友可以參考下
    2017-04-04
  • Java中jstat命令的使用詳解

    Java中jstat命令的使用詳解

    jstat命令可以查看堆內(nèi)存各部分的使用量,以及加載類(lèi)的數(shù)量,下面這篇文章主要給大家介紹了關(guān)于Java中jstat命令使用的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-03-03
  • 深入講解基于JDK的動(dòng)態(tài)代理機(jī)制

    深入講解基于JDK的動(dòng)態(tài)代理機(jī)制

    眾所周知相比于靜態(tài)代理,動(dòng)態(tài)代理避免了開(kāi)發(fā)人員編寫(xiě)各個(gè)繁鎖的靜態(tài)代理類(lèi),下面這篇文章主要給大家介紹了關(guān)于基于JDK的動(dòng)態(tài)代理機(jī)制的相關(guān)資料,文中通過(guò)圖文以及示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2018-07-07
  • JVM調(diào)優(yōu)參數(shù)的設(shè)置

    JVM調(diào)優(yōu)參數(shù)的設(shè)置

    Java虛擬機(jī)的調(diào)優(yōu)是一個(gè)復(fù)雜而關(guān)鍵的任務(wù),可以通過(guò)多種參數(shù)來(lái)實(shí)現(xiàn),本文就來(lái)介紹一下JVM調(diào)優(yōu)參數(shù)的設(shè)置,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-03-03

最新評(píng)論