問(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; } |
- @TableId(value = "id", type = IdType.ID_WORKER)表示通過(guò)mybatis-plus自帶的優(yōu)化版本的SnowFlake算法生成主鍵。
- 關(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