【MybatisPlus】后端用枚举类,数据库用tinyint,存在枚举类型转换

095-尚庭公寓-项目开发-后台管理-公寓管理-标签-查询列表-类型转换问题分析_哔哩哔哩_bilibili

使用枚举类

提高可读性,使用枚举类

数据库设计

数据库中,type定义成tinyint类型

实体类

实体类中,对于type字段,定义成枚举类

type字段各种形式

前后端交互

WebDataBinder类型转换

http请求上的参数会被绑定到Controller方法的参数上

前端传来的是数字,Controller方法上是ItemType类型的对象,靠SpringMVC的组件WebDataBinder类型转换

将ItemType类型对象转换成数字1, 因为在数据库中type是tinyint,由Mybatis中的TypeHandler完成

http请求的参数,不分数据类型,所有的参数都是文本

将String类型的值1转换成ItemType时失败

所以问题出在请求流程中,WebDataBinder,方法参数绑定的环节

因为http请求的参数,不分数据类型,所有的参数都是文本,也就是字符串

WebDataBinder枚举类型转换

WebDataBinder提供了从String到枚举类型的转换器

但是String到枚举类型的默认转换规则是根据实例名称转换为枚举对象实例

APARTMENT和ROOM是各自实例的名称

如果给"APARTEMNT"这样的字符串,能够转换成ItemType.APARTMENT实例

但是现在,前端传递type=1或者2(前端传的是字符串),不行

自定义Converter

Spring官网,convert是一个通用的类型转换系统

Spring Type Conversion :: Spring Framework

S代表原始类型,T代表目标类型

​​

获取枚举对象实例

可以用if...else,但如果枚举类中定义的实例很多,就会复杂

枚举类的静态方法(法一)

所有枚举类都有两个静态方法

valueOf(),根据传入的实例名称,返回对应的枚举对象实例

values(),返回枚举类的所有实例对象

​​

反射(法二)

获取class对象,也能调用getEnumConstants()获取枚举实例(反射)

​​​​

向SpringMVC注册自定义的Converter

WebMvcConfigurer是SpringMVC提供的,专门用于自定义配置的接口

只要实现了这个接口,就可以完成各项与SpringMVC相关的配置了

通过registry注册自己的Converter,需要传入自定义Converter对象

**可以直接new者注入实例(推荐)**​​

ConverterFactory(统一实现所有枚举类型转换逻辑)

官方文档

Spring Type Conversion :: Spring Framework

R表示目标类型的父类

ConverterFactory这个接口,可以负责从S这个原始类型,到R这个类型的所有子类的类型转换

getConverter()方法:

  • 参数:目标类型T的Class对象,代表最终的目标类型
  • 返回值:从原始类型S到目标类型T的Converter转换器

为所有枚举类指定父接口

实现ConverterFactory接口时,R填写BaseEnum就行了

代码

注册

@EnumValue,@JsonValue

默认情况下

TypeHandler不会自动将枚举实例转成1,HTTPMessageConverter同理

使用注解@EnumValue,@JsonValue解决

​​

TypeHandler枚举类型转换 ​

TypeHandler可枚举类型的默认转换规则是枚举对象实例(ItemType.APARTMENT)和实例名称("APARTMENT")相互映射

把注解@EnumValue添加在code上,就是将枚举实例与code进行映射

后端和数据的类型转换

HTTPMessageConverter枚举类型转换

​后端和前端的类型转换

相关推荐
数智化管理手记2 小时前
海量数据如何沉淀有效数据资产?数据标准化治理方案如何搭建?
java·大数据·人工智能
cfm_29142 小时前
SpringAI + Ollama 本地大模型
java·开发语言·人工智能·语言模型
鲸采云SRM采购管理系统3 小时前
采购管理系统哪家好?2026最新测评对比
java·服务器·数据库
0x534 小时前
Java网络编程(二)
java·服务器·网络
Flittly4 小时前
【雕虫大技】Agent 动态 Skill 供应链安全加固(三):输出校验与治理闭环实战
java·spring boot·spring
Poo_Chai4 小时前
QT emit信号后完整处理流程,包括槽函数响应流程
java·开发语言·数据库
瑞码空间4 小时前
Java 图形界面(GUI)完整知识点手册
java·开发语言·图形界面·swing
树码小子4 小时前
开启 IDEA 中的断言功能
android·java·intellij-idea
茶本无香5 小时前
Java调用Shell脚本执行SQL数据库操作:从入门到实战
java·sql·shell