java开发中,枚举类型在数据库、服务端和客户端三者之间的相互转换

版本

  • SpringBoot: 2.7.18
  • JDK: 1.8
  • mybatis-plus: 3.5.5
  • jackson: SpringBoot内置的jackson

序列化Serialization和反序列化Deserialization

在Java中,序列化(Serialization)和反序列化(Deserialization)是指将对象的状态转换为字节流(序列化)以及从字节流恢复对象状态(反序列化)的过程。

1、序列化Serialization

将对象的状态信息转换为可以存储或传输的形式。在Java中,通过实现Serializable接口来标记一个类的对象是可以被序列化的。序列化后的数据可以保存到文件、数据库或通过网络传输。

  • 含有枚举类型的实体类对象序列化为返给前端或者保存到数据库的对象。

2、反序列化Deserialization

将序列化的数据恢复成对象的过程。反序列化时,Java虚拟机会检查类的版本标识符(即serialVersionUID),以确保发送方和接收方的类版本一致,从而保证对象能够正确地恢复。

  • 前端通过接口传的参数(get/post)或者后端查询数据库的数据反序列化为含有枚举类型的实体类

三者的相互转化

1、数据库和SpringMVC序列化和反序列化

数据库和SpringMVC之间,数据请求和数据响应都是通过Mybatis的TypeHandler处理。TypeHandler用于处理Java中的实体对象与数据库之间的数据类型转换。

2、SpringMVC和前端序列化和反序列化

SpringMVC中的HTTPMessageConverter组件负责将Controller方法的返回值(Java对象)转换为HTTP响应体中的JSON字符串,或者将请求体中的JSON字符串转换为Controller方法中的参数(Java对象);
SpringMVC中的WebDataBinder组件负责将HTTP的请求参数绑定到Controller方法的参数,并实现参数类型的转换。

数据库和SpringMVC序列化和反序列化

均是借用TypeHandler

第一步: 指定枚举类所在的包

mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    # 指定枚举类所在的包
    type-enums-package: com.zhw.lease.model.enums

第二步: 使用MybatisPlus提供的通用的处理枚举类型的TypeHandler

public enum ItemType {
   
   

    APARTMENT(1, "公寓"),
    ROOM(2, "房间");
	
	// @EnumValue放在和数据库字段一个类型的属性上
    @EnumValue
    private Integer code;
    private String name;

    ItemType(Integer code, String name) {
   
   
        this.code = code;
        this.name = name;
    }
}

注意:

mybatis-plus在3.5.2版本以下需要配置default-enum-type-handler:com.baomidou.mybatisplus.core.handlers.MybatisEnumTypeHandler+@EnumValue才有效

SpringMVC和前端序列化和反序列化

1、get请求

1.1、序列化:java对象转前端响应

@JsonValue: 此注解标记的字段类型对应前端返回的类型

1.2、反序列化:前端传的参数转为java对象

第一步: 自定义Converter

package com.zhw.lease.web.admin.converter;

import com.zhw.lease.model.enums.BaseEnum;
import org.springframework.core.convert.converter.Converter;
import org.springframework.core.convert.converter.ConverterFactory;
import org.springframework.stereotype.Component;

// get方式的反序列化
// 反序列化=》前端参数转后端实体中的枚举类型
@Component
public class StringToBaseEnumConverterFactory implements ConverterFactory<String, BaseEnum> {
   
   
    @Override
    public <T extends BaseEnum> Converter<String, T> getConverter(Class<T> targetType) {
   
   
        return new Converter<String, T>() {
   
   
            @Override
            public T convert(String source) {
   
   
                for (T enumConstant : targetType.getEnumConstants()) {
   
   
                    if (enumConstant.getCode().equals(Integer.valueOf(source))) {
   
   
                        return enumConstant;
                    }
                }
                throw new IllegalArgumentException("非法的枚举值:" + source);
            }
        };
    }
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

原谅我很悲

不要打赏哦,加个好友一起学习呗

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值