记录:同事问为什么Mysql设置id自增,结果是雪花算法生成?

使用插件自动生成代码,的确是一件很省心的事情,但是同事遇到了一件事,说返给前端的数据,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。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值