1. 枚举-json处理(前端 <=> 后端 <=> 数据库)
前端传递 枚举code
后端响应 枚举code
表里存储 枚举code
内存处理 枚举对象
@Getter
@AllArgsConstructor
@JsonFormat(shape = JsonFormat.Shape.OBJECT)
public enum SexEnum {
MALE(0, "男"),
FEMALE(1, "女"),
UNKNOWN(2, "未知");
/**
* 前端传递不存在的枚举code,报400错误(起到规范作用)
*/
@JsonValue // 告诉jackson 返回json时,使用这个属性
@EnumValue // 告诉mybatis-plus 这个枚举在数据库中保存为这个字段的值
private final int code;
private final String desc;
}
/**
* 用户性别(0男 1女 2未知)
*/
@TableField(value = "sex")
private SexEnum sex; // 表里是int类型,实体类字段用枚举类型封装
yml:
mybatis-plus:
type-enums-package: com.example.demo.guigu.enums
2. 枚举-mapper.xml
mapper.xml 中,直接使用 枚举对象.code 进行判断
List<SysUser> getEnumeData(@Param("se") SexEnum sexEnum);
<select id="getEnumeData" resultType="com.atguigu.admin.entity.SysUser">
select * from sys_user where sex = #{se.code}
</select>
3. 前端丢失大Long精度问题
问题描述:表里的主键如果是大Long,后端用Long包装并返回给前端,前端收到的Long会丢失精度
解决办法:后端统一把Long转成String再返回给前端
// 统一将 Long 类型序列化为 String
@Configuration
public class JacksonConfiguration {
@Bean
public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {
return builder -> {
// 把 Long 类型序列化为 String
builder.serializerByType(Long.class, ToStringSerializer.instance);
};
}
}
@Component
public class LongToStringConverter extends JsonSerializer<Long> {
@Override
public void serialize(Long aLong, JsonGenerator jsonGenerator,
SerializerProvider serializerProvider) throws IOException {
jsonGenerator.writeString(aLong.toString());
}
}
如若此做,后端响应给前端的json里原本Long类型的字段全变成字符串
讲解视频:https://www.bilibili.com/video/BV1dE421P7y5