一:问题描述
记录一下困扰一晚上的一个问题,在使用MybatisPlus(简称"MP")简化开发的时候,在执行添加功能的时候,使用MP的id生成策略生成的id是一个很长的long类型的数字。数字长其实还没事,过分的是他还导致我的删除功能和修改功能都有无法实现了。
二、原因
使用 MybatisPlus的id生成策略产生的id数太大,超过了JavaScript能够解析的最大范围,这样会导致精度丢失,前台获取到的id和后台数据库中不一致,从而导致无法进行增删改操作。当id定义为Long类型后,生成的id是一个19位数,而 js 能够支持解析的范围是在-9007199254740992到+9007199254740992之间,最大值才16位数。
小插曲: 记录一下MybatisPlus的生成策略:
使用:@TableId 注解
具体使用:
@TableId(type = IdType.ASSIGN_ID)
private String id;
分类:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnL0EGNiJzM1E2Y2QWZhN2M4MDZzQzNxMzY0YDOhRWMyMzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
三、解决办法
方案一:加注解
在id上边加这个注解
@JsonSerialize(using = ToStringSerializer.class)
众所周知,String是没有范围的,这个注解就会把生成的结果转化为String类型。
@TableName("users")
public class User {
@TableId(type = IdType.ASSIGN_ID)
@JsonSerialize(using = ToStringSerializer.class)
private Long id;
方案二:干脆把id类型全改为String类型
把后台代码中的id都转换为String类型,前端代码无需改变
实体类:
@TableName("users")
public class User {
@TableId(type = IdType.ASSIGN_ID)
private String id;
控制层:
@GetMapping("/{id}")
public String findById(@PathVariable String id) {
User user = userMapper.selectById(id);
return "success";
}