【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枚举类型转换

​后端和前端的类型转换

相关推荐
无限的鲜花8 小时前
反射(原创推荐)
java·开发语言
IT二叔9 小时前
Java项目部署-03-teamcity-cicd-docker镜像流水线方式部署
java·ci/cd·持续部署
一路向北he9 小时前
字节钢铁军团--“提供情境,而非控制”
java·开发语言·前端
超级数据查看器9 小时前
超级数据查看器 v10.0 发布
java·大数据·数据库·sqlite·安卓
折哥的程序人生 · 物流技术专研11 小时前
《Java 100 天进阶之路》第50篇:阻塞队列与并发容器(2026版)
java·面试题·java进阶·blockingqueue·并发容器·集合源码·java100天进阶
ai_coder_ai11 小时前
编写自动化脚本,在自己后端服务中使用Open Api进行设备相关操作
java·运维·自动化
硕风和炜11 小时前
【LeetCode: 2492. 两个城市间路径的最小分数 + DFS】
java·算法·leetcode·深度优先·dfs·bfs·并查集
格子软件12 小时前
2026年GEO贴牌代理:分布式多级分账状态机源码深度解构
java·vue.js·分布式·vue·geo
我是一颗柠檬12 小时前
【Java项目技术亮点】加权轮询负载均衡算法
java·算法·负载均衡
灯厂码农12 小时前
C语言动态内存分配完全指南(malloc、calloc、realloc、free)
java·c语言·算法