mybatis-plus IdWorker生成的Id和返回给前台的不一致的解决
问题描述
今天在公司项目中修改id的生成策略为mybatis-plus自带的IdWorker策略时,发现返回给前台的id竟然和数据库不一致。费解得很呐。
packagenet.mshome.twisted.tmall.entity;
importcom.baomidou.mybatisplus.annotation.FieldFill;
importcom.baomidou.mybatisplus.annotation.IdType;
importcom.baomidou.mybatisplus.annotation.TableField;
importcom.baomidou.mybatisplus.annotation.TableId;
importlombok.AllArgsConstructor;
importlombok.Data;
importlombok.NoArgsConstructor;
importjava.io.Serializable;
importjava.time.LocalDateTime;
/**
*数据库实体类的父类,必需字段
*
*@authortangjizhouchn@foxmail.com
*@date2019/9/6
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
publicclassBaseEntityimplementsSerializable{
privatestaticfinallongserialVersionUID=236424297319280526L;
/**
*数据表主键,此处采用mybatis-plus自带的IdType.ID_WORKER策略
*/
@TableId(value="id",type=IdType.ID_WORKER)
protectedLongid;
/**
*数据创建时间
*/
@TableField(fill=FieldFill.INSERT)
protectedLocalDateTimecreateTime;
/**
*数据更新时间
*/
@TableField(fill=FieldFill.INSERT_UPDATE)
protectedLocalDateTimeupdateTime;
}
- @TableId(value="id",type=IdType.ID_WORKER)表示通过mybatis-plus自带的优化版本的SnowFlake算法生成主键。
- 关于主键生成方式,可以看看这个类com.baomidou.mybatisplus.core.toolkit.IdWorker
问题原因
mybatis-plus的ID_WORKER策略会生成一个Long型的很长长长长的数字,这个数字传到前台之后,超过了js中数字的最大范围,具体表现为最后两位始终为0。
解决办法
很容易想到,超过了js数字最大范围,那直接转成String类型就完了。
方案一(适合BaseEntity方式)
packagenet.mshome.twisted.tmall.entity;
importcom.baomidou.mybatisplus.annotation.FieldFill;
importcom.baomidou.mybatisplus.annotation.IdType;
importcom.baomidou.mybatisplus.annotation.TableField;
importcom.baomidou.mybatisplus.annotation.TableId;
importcom.fasterxml.jackson.databind.annotation.JsonSerialize;
importcom.fasterxml.jackson.databind.ser.std.ToStringSerializer;
importlombok.AllArgsConstructor;
importlombok.Data;
importlombok.NoArgsConstructor;
importjava.io.Serializable;
importjava.time.LocalDateTime;
/**
*数据库实体类的父类,必需字段
*
*@authortangjizhouchn@foxmail.com
*@date2019/9/6
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
publicclassBaseEntityimplementsSerializable{
privatestaticfinallongserialVersionUID=236424297319280522L;
/**
*数据表主键
*/
@TableId(value="id",type=IdType.ID_WORKER)
@JsonSerialize(using=ToStringSerializer.class)
protectedLongid;
/**
*数据创建时间
*/
@TableField(fill=FieldFill.INSERT)
protectedLocalDateTimecreateTime;
/**
*数据更新时间
*/
@TableField(fill=FieldFill.INSERT_UPDATE)
protectedLocalDateTimeupdateTime;
}
添加@JsonSerialize(using=ToStringSerializer.class)将结果转换成String。
此方案适合有baseEntity的时候,避免每个entity都要单独维护,很麻烦。
方案二(全局处理-两种方式)
packagenet.mshome.twisted.tmall.configuration;
importcom.fasterxml.jackson.databind.ObjectMapper;
importcom.fasterxml.jackson.databind.module.SimpleModule;
importcom.fasterxml.jackson.databind.ser.std.ToStringSerializer;
importcom.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
importcom.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;
importcom.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
importorg.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;
importorg.springframework.context.annotation.Bean;
importorg.springframework.context.annotation.Configuration;
importorg.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
importjava.time.LocalDate;
importjava.time.LocalDateTime;
importjava.time.format.DateTimeFormatter;
/**
*系统通用简单配置
*
*@authortangjizhouchn@foxmail.com
*@date2019/10/16
*/
@Configuration
publicclassTmallConfiguration{
/**
*方式一:此方式可以灵活配置任意类型的序列化反序列化
*/
@Bean
publicJackson2ObjectMapperBuilderCustomizerbuilderCustomizer(){
DateTimeFormatterdateFormatter=DateTimeFormatter.ofPattern("yyyy-MM-dd");
DateTimeFormatterdateTimeSerializeFormatter=DateTimeFormatter.ofPattern("yyyy-MM-ddHH:mm:ss");
DateTimeFormatterdateTimeDeserializeFormatter=DateTimeFormatter.ofPattern("yyyy-MM-ddHH:mm");
returnbuilder->{
//所有Long类型转换成String到前台
builder.serializerByType(Long.class,ToStringSerializer.instance);
builder.serializerByType(LocalDate.class,newLocalDateSerializer(dateFormatter));
builder.serializerByType(LocalDateTime.class,newLocalDateTimeSerializer(dateTimeSerializeFormatter));
builder.deserializerByType(LocalDateTime.class,newLocalDateTimeDeserializer(dateTimeDeserializeFormatter));
};
}
/**
*
*方式二:采用objectMapper注入
*/
@Bean
publicObjectMapperobjectMapper(Jackson2ObjectMapperBuilderbuilder){
ObjectMapperobjectMapper=builder.createXmlMapper(false).build();
SimpleModulesimpleModule=newSimpleModule();
//直接将所有的Long类型转换为String
simpleModule.addSerializer(Long.class,ToStringSerializer.instance);
simpleModule.addSerializer(Long.TYPE,ToStringSerializer.instance);
objectMapper.registerModule(simpleModule);
returnobjectMapper;
}
}
直接将所有的Long类型转换为String给前台展示。后台用Long接收前台传入的数字String也可以的,Spring会自动给我们转换。
到此这篇关于mybatis-plusIdWorker生成的Id和返回给前台的不一致的解决的文章就介绍到这了,更多相关mybatis-plusIdWorker生成Id内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。