【新】ApiHug如何更好处理Enum

如何更好处理Enum - ApiHugHope 如何更好处理Enum(列表)https://apihug.com/zhCN-docs/how/003_how_to_handle_enum

Enum处理是个棘手的问题,在应用程序中,枚举常量很好避免了hard-code, 但是在API的传输、数据库层序列化反序列化如何处理Enum?

如果再加上列表支持, 这个问题就又复杂了一个维度,Enum 有默认的 name 和 oridinal 两种标识方式。

  1. name(string): Returns the name of this enum constant, exactly as declared in its enum declaration.
  2. original(int): The ordinal of this enumeration constant (its position in the enum declaration, where the initial constant is assigned an ordinal of zero).

oridinal 视乎是个非常高效传递和存储方式, 但是original 在 Enum 演进过程中可能被破坏,而且难以理解和阅读。

基于此,Hope 框架, 集合丰富的工程实践,在何如处理 Enum 数据类型问题上找到了一个比较适中的方案:

两个交接点:

  1. 网络传输:API层, (Spring 自动处理)
  2. 序列化层: 数据库(读、写)

两种格式:

  1. 单个
  2. 多个(List)

目的:

  1. 直观简单
  2. 低学习成本

​协议

自 1.1.5-RELEASE 只留下2中配置方式, 亦可参考 jakarta.persistence.EnumType

  1. STRING: 默认hope.common.enumeration.Enumeration#title(),代理到 java.lang.Enum#name()
  2. CODE: hope.common.enumeration.Enumeration#code() 未取 oridinal(hope框架内不再使用,避免解释和认知成本)
enum EnumType {
  //Default as STRING
  // Persist `hope.common.enumeration.Enumeration#title()` usually this will delegate to the `java.lang.Enum#name()`
  STRING = 0;
  // Persist `hope.common.enumeration.Enumeration#code()`
  CODE = 1;
}

​定义

Entity 定义:

  1. status_listOrderStatusEnum 列表,CODE 例子: 100001,10002
  2. status: 单个 OrderStatusEnum, 使用 TITLE 例子: PLACED
 repeated OrderStatusEnum status_list = 3 [(hope.persistence.column) = {
    name: "STATUS_LIST",
    type: VARCHAR
    length:{
      value: 64
    }
    enum_type: CODE
  }];

  OrderStatusEnum status = 4 [(hope.persistence.column) = {
    name: "status",
    type: VARCHAR
    length:{
      value: 64
    }
    enum_type: STRING
  }];

​生成

生成部门主要涉及, Spring JDBC reader/writer(OLAP), Mybatis Reader/Query(OLTP);

Hope OLTP 基于 Spring Data JDBC (非 JPA/Hibernate/Mybatis)!

OLAP 基于 Mybatis Query DSL, 用于统计、查询, 不建议用来做写操作!

类名功能包含类备注
*domain.bootstrap.converter.{Domain}ConverterSpring data convertOrderStatus(CodeListReaderConverter、CodeListWriterConverter、Title)Spring JDBC 初始化注入
*domain.bootstrap.mybatis.type.*TypeHandleribatis type TypeHandlerOrderStatus(CodeListTypeHandler、TitleListTypeHandler、Title)Batis Column Converter

Hope框架会:

  1. JDBC 配置时, JdbcCustomConversions 引入扩展 Converter
  2. Mybatis 配置时:org.mybatis.dynamic.sql.SqlColumn 定义引入 TypeHandler, 和 parameter ParameterTypeConverter

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

ApiHug

God Bless U

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

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

打赏作者

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

抵扣说明:

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

余额充值