实体类JSON字段的终极转换思路

实体类JSON字段的终极转换思路-1

哈喽,各位代码战士们,我是Jensen,一个梦想着和大家一起在代码的海洋里遨游,顺便捡起那些散落的知识点的程序员小伙伴。

听说大家都不爱当“接码侠”,笔者在接盘别人代码之时也常意难平,我的心情大部分是这样的:

今天看看数据库JSON字段是怎么映射到代码上来的。

本文涉及技术栈:类型处理器、D3Boot。

一、都有些什么写法

1.用String映射

这种是最简单最普遍的写法,JSON不就是字符串嘛,能存能取就行了,存数据库跟存银行没什么区别,数据库存一条,银行存一“张不够花”。

前后端要用?对不起,自己解析去吧,用Json工具类,转完七七四十九遍以后,别把这个字符串玩坏就行。

完了以后,隔壁组的数据分析狮张开了她的獠牙看向你……

2.用JSONObject映射

那我用世界500强公司的com.alibaba.fastjson.JSONObject总可以了吧。

可以是可以,但麻烦是真麻烦,取元素出来还得转换成具体的类型,只能通过字符串Key取值,还得引入个fastjson包,对于没什么阿里信仰的同学可能不是那么的友好。

Hutool包也有个同类名的cn.hutool.json.JSONObject,一不小心把两个给搞混就GG了。

要是再遇到你的同类把一个实体从头传到尾,再作为DTO提供Jar包出去就……

3.自定义类型处理器

其实,在Mybatis这个主流ORM框架中,有这么一个抽象类:

org.apache.ibatis.type.BaseTypeHandler

它是 MyBatis 框架中一个非常重要的类,它提供了一个通用的基类,用于自定义类型处理器(TypeHandler)。

在 MyBatis 中,类型处理器负责在 Java 类型和 JDBC 类型之间的转换。当你想要对某种类型进行特殊的处理,或者 MyBatis 默认的类型处理器不能满足你的需求时,你可以自定义一个类型处理器。

以下是 BaseTypeHandler的一些关键点:

  • 泛型:BaseTypeHandler 使用泛型 T 来指定它所处理的 Java 类型。
  • 继承:自定义类型处理器通常继承自 BaseTypeHandler,并且重写几个核心方法。
  • 核心方法——void setParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType):此方法用于将 Java 类型设置到 SQL 语句的参数中。
  • 核心方法——T getResult(ResultGetter getter, Class clazz):此方法用于从 SQL 查询的结果集中获取 Java 类型。
  • 类型转换:BaseTypeHandler 的子类可以实现具体的类型转换逻辑,包括日期时间格式的转换、枚举类型的转换、复杂对象的序列化和反序列化等。
  • 配置:自定义的类型处理器可以在 MyBatis 的映射文件中配置,与特定的字段或结果集映射相关联。
  • 重用:由于 BaseTypeHandler 是泛型的,因此可以为不同的类型创建不同的处理器,同时重用相同的处理逻辑。
  • 通过继承 BaseTypeHandler 并实现必要的方法,你可以完全控制数据在 Java 对象和数据库之间的转换过程,这为处理复杂的业务逻辑提供了灵活性。

    通过类型处理器,我们可以映射成任意类型,存取数据其实没有那么的麻烦。

    不错不错,就它了。

    二、还是先造个轮子吧