钜形不锈钢水箱 发表于 2024-12-23 04:43:37

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);
            }
      };
    }
}
   

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: java开辟中,枚举类型在数据库、服务端和客户端三者之间的相互转换