mybatis-plus IdWorker生成的Id和返回給前臺(tái)的不一致的解決
問(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; }
- @TableId(value = "id", type = IdType.ID_WORKER)表示通過(guò)mybatis-plus自帶的優(yōu)化版本的SnowFlake算法生成主鍵。
- 關(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)文章
字節(jié)碼調(diào)教入口JVM?寄生插件javaagent
這篇文章主要介紹了字節(jié)碼調(diào)教入口JVM?寄生插件javaagent方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08java基于Socket做一個(gè)簡(jiǎn)單下載器
這篇文章主要為大家詳細(xì)介紹了java如何基于Socket制作一個(gè)簡(jiǎn)單下載器,感興趣的小伙伴們可以參考一下2016-08-08用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í)路線指南
在本篇文章里小編給大家整理的是一篇關(guān)于Java開(kāi)發(fā)學(xué)習(xí)路線以及期中的主要知識(shí)點(diǎn)內(nèi)容,有興趣的朋友么可以學(xué)習(xí)下。2022-11-11深入講解基于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-07JVM調(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