一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語(yǔ)言|JavaScript|易語(yǔ)言|vb.net|

服務(wù)器之家 - 編程語(yǔ)言 - Java教程 - mybatis-plus IdWorker生成的Id和返回給前臺(tái)的不一致的解決

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

2021-08-20 10:58唯學(xué)習(xí)方能解憂 Java教程

這篇文章主要介紹了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)解得很吶。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
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í)體類的父類,必需字段
 *
 * @author [email protected]
 * @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è)類 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類型就完了。

方案一(適合BaseEntity方式)

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
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í)體類的父類,必需字段
 *
 * @author [email protected]
 * @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ù),很麻煩。

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
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 [email protected]
 * @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類型轉(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類型轉(zhuǎn)換為String
    simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
    simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance);
    objectMapper.registerModule(simpleModule);
    return objectMapper;
  }
}

直接將所有的Long類型轉(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)搜索服務(wù)器之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持服務(wù)器之家!

原文鏈接:https://blog.csdn.net/qq_28483499/article/details/101317487

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 欧美日韩不卡视频 | 国产卡一卡二卡3卡乱码免费 | b站免费网站入口 | 四虎影院永久网站 | 国产高清在线视频一区二区三区 | 婷婷综合在线 | 国产成人精品曰本亚洲78 | 91啦在线播放 | 99热精品在线播放 | 日本一区二区三区在线 观看网站 | 2019中文字幕在线视频 | 日本中文字幕一区二区高清在线 | 久久黄色小视频 | 久久强奷乱码老熟女 | 国产情侣啪啪 | 精品国产品国语在线不卡丶 | 青青草99热这里都是精品 | 91久久精品青青草原伊人 | 美女扒开腿让男人桶爽免费gif | 成人在线日韩 | 国色天香视频资源网 | 日本欧美不卡一区二区三区在线 | 人人爽人人看 | 日韩视频免费一区二区三区 | 国产成人免费片在线观看 | 99网站在线观看 | 不卡日本 | 800精品国产导航 | 日本午夜大片免费观看视频 | 亚洲色欲色欲综合网站 | 美女校花被调教出奶水 | 波多野结衣同性系列698 | 亚洲精品视频在线 | 欧美一区二区三区大片 | 国产乱子伦在线观看不卡 | 大胸被c出奶水嗷嗷叫 | 2022色婷婷综合久久久 | 欧美黑人换爱交换乱理伦片 | 国产精品欧美亚洲韩国日本 | 免费高清视频日本 | 国产高清路线一路线二2022 |