mybatis-plus IdWorker生成的Id和返回給前臺的不一致的解決
問題描述
今天在公司項目中修改id的生成策略為mybatis-plus自帶的IdWorker策略時,發(fā)現(xiàn)返回給前臺的id竟然和數(shù)據(jù)庫不一致。費解得很吶。
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ù)庫實體類的父類,必需字段
*
* @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)建時間
*/
@TableField(fill = FieldFill.INSERT)
protected LocalDateTime createTime;
/**
* 數(shù)據(jù)更新時間
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
protected LocalDateTime updateTime;
}
- @TableId(value = "id", type = IdType.ID_WORKER)表示通過mybatis-plus自帶的優(yōu)化版本的SnowFlake算法生成主鍵。
- 關(guān)于主鍵生成方式,可以看看這個類 com.baomidou.mybatisplus.core.toolkit.IdWorker
問題原因
mybatis-plus的ID_WORKER策略會生成一個Long型的很長長長長的數(shù)字,這個數(shù)字傳到前臺之后,超過了js中數(shù)字的最大范圍,具體表現(xiàn)為最后兩位始終為 0。
解決辦法
很容易想到,超過了js數(shù)字最大范圍,那直接轉(zhuǎn)成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;
/**
* 數(shù)據(jù)庫實體類的父類,必需字段
*
* @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)建時間
*/
@TableField(fill = FieldFill.INSERT)
protected LocalDateTime createTime;
/**
* 數(shù)據(jù)更新時間
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
protected LocalDateTime updateTime;
}
添加 @JsonSerialize(using = ToStringSerializer.class)將結(jié)果轉(zhuǎn)換成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;
/**
* 系統(tǒng)通用簡單配置
*
* @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類型轉(zhuǎn)換成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類型轉(zhuǎn)換為String
simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance);
objectMapper.registerModule(simpleModule);
return objectMapper;
}
}
直接將所有的Long類型轉(zhuǎn)換為String給前臺展示。后臺用Long接收前臺傳入的數(shù)字String也可以的,Spring會自動給我們轉(zhuǎn)換。
到此這篇關(guān)于mybatis-plus IdWorker生成的Id和返回給前臺的不一致的解決的文章就介紹到這了,更多相關(guān)mybatis-plus IdWorker生成Id內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
字節(jié)碼調(diào)教入口JVM?寄生插件javaagent
這篇文章主要介紹了字節(jié)碼調(diào)教入口JVM?寄生插件javaagent方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-08-08
用StopWatch優(yōu)雅替代currentTimeMillis計算程序執(zhí)行耗時
別再用System.currentTimeMillis()計算程序執(zhí)行耗時了,擁抱StopWatch優(yōu)雅來優(yōu)雅的計算,代碼更簡潔效率更高,本文帶你了解StopWatch的使用2021-09-09
JVM調(diào)優(yōu)參數(shù)的設(shè)置
Java虛擬機的調(diào)優(yōu)是一個復(fù)雜而關(guān)鍵的任務(wù),可以通過多種參數(shù)來實現(xiàn),本文就來介紹一下JVM調(diào)優(yōu)參數(shù)的設(shè)置,具有一定的參考價值,感興趣的可以了解一下2024-03-03

