人的一切痛苦,本质上都是对自己的无能的愤怒。——王小波
我们clone
下来mybatis-plus
官方示例项目:
https://gitee.com/baomidou/mybatis-plus-samples.git
首先看文档:
- JSON 字段类型
@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 中写法为
<result column="other_info" jdbcType="VARCHAR" property="otherInfo" typeHandler="com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler" />
文档表明,首先要加@TableName(autoResultMap = true)
注解,然后再指定typeHandler
打开示例项目,可以看到确实如此
并且我们数据库表里的数据wallets
字段为json
我们运行测试类测试一下:
得到的结果也是完美映射
可以看到我们这里也能自定义转换器
他这里是jackson
的,如果我们要使用fastjson
的,则可以继承fastjsonTypeHandler
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>>() { }); } }
测试了下,成功转换