人的一切痛苦,本质上都是对自己的无能的愤怒。——王小波

我们clone下来mybatis-plus官方示例项目:

1
https://gitee.com/baomidou/mybatis-plus-samples.git

首先看文档:

  • JSON 字段类型
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
@Data
@Accessors(chain = true)
@TableName(autoResultMap = true)
public class User {
private Long id;

...


/**
* 注意!! 必须开启映射注解
*
* @TableName(autoResultMap = true)
*
* 以下两种类型处理器,二选一 也可以同时存在
*
* 注意!!选择对应的 JSON 处理器也必须存在对应 JSON 解析依赖包
*/
@TableField(typeHandler = JacksonTypeHandler.class)
// @TableField(typeHandler = FastjsonTypeHandler.class)
private OtherInfo otherInfo;

}

该注解对应了 XML 中写法为

1
<result column="other_info" jdbcType="VARCHAR" property="otherInfo" typeHandler="com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler" />

文档表明,首先要加@TableName(autoResultMap = true)注解,然后再指定typeHandler

打开示例项目,可以看到确实如此

image-20210917184019702

并且我们数据库表里的数据wallets字段为json

image-20210917184806288

我们运行测试类测试一下:

得到的结果也是完美映射

image-20210917184122076

可以看到我们这里也能自定义转换器

image-20210917184222645

他这里是jackson的,如果我们要使用fastjson的,则可以继承fastjsonTypeHandler

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package com.baomidou.mybatisplus.samples.typehandler;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler;
import com.baomidou.mybatisplus.samples.typehandler.entity.Wallet;

import java.util.List;

/**
* 自定义复杂类型处理器<br/>
* 不要问我为什么要重写 parse 因为顶层父类是无法获取到准确的待转换复杂返回类型数据
*/
public class WalletListTypeFastJsonHandler extends FastjsonTypeHandler {
public WalletListTypeFastJsonHandler(Class<?> type) {
super(type);
}

@Override
protected Object parse(String json) {
return JSON.parseObject(json, new TypeReference<List<Wallet>>() {
});
}
}

测试了下,成功转换

image-20210917184649445