使用插件自动生成代码,的确是一件很省心的事情,但是同事遇到了一件事,说返给前端的数据,id明明没问题,但是前端调试的时候,两组数据除了id一样,其他都不一样,但是他查了数据库,id都是不一样的,我瞄了一眼id,就知道了大概情况,因为id设置的是bigint类型,生成的id是19位,而前端由于JavaScript中Number类型的自身原因(17位),并不能完全表示Long型的数字,在Long长度大于17位时会出现精度丢失的问题,后三位会变成0。
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
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;
@Configuration
public class JacksonConfig {
/**
* Jackson全局转化long类型为String,解决jackson序列化时long类型缺失精度问题
*
* @return Jackson2ObjectMapperBuilderCustomizer 注入的对象
*/
@Bean
public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {
Jackson2ObjectMapperBuilderCustomizer cunstomizer = new Jackson2ObjectMapperBuilderCustomizer() {
@Override
public void customize(Jackson2ObjectMapperBuilder jacksonObjectMapperBuilder) {
jacksonObjectMapperBuilder.serializerByType(Long.TYPE, ToStringSerializer.instance);
jacksonObjectMapperBuilder.serializerByType(Long.class, ToStringSerializer.instance);
}
};
return cunstomizer;
}
}
加了配置,解决了同事的问题,同事又提出一个想法,我建表语句设置的id自增为1,为什么id生成的这么长?看语句:AUTO_INCREMENT = 1
CREATE TABLE `message_read` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
`user_id` bigint NOT NULL COMMENT '目标id',
`msg_title` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '消息标题',
`msg_content` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '描述',
`msg_status` int NULL DEFAULT NULL COMMENT '消息状态:保留以后做重试',
`read_status` int NULL DEFAULT NULL COMMENT '是否已读 0未读 1已读',
`notice_type` int NULL DEFAULT NULL COMMENT '通知类型 0: 站内信 1:待办 2:短息',
`mobile` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '手机号码',
`extra` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`created` datetime NULL DEFAULT NULL COMMENT '创建时间',
`updated` datetime NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '读取表' ROW_FORMAT = DYNAMIC;
我看了一下entity,发现其并未在id字段上添加如下注解:
@TableId(value = "id", type = IdType.AUTO)
private Long id;
需要注意的是,如果Entity类未指定@TableId(type=IdType.AUTO),那么mybatisPlus会默认将id的类型设为@TableId(type=IdType.NONE),使用雪花算法自动帮你设置id。