mybatis需显式配置typehandler实现json字段与java对象双向转换,实体类须用@tablefield指定处理器并启用@tablename(autoresultmap=true),xml方式需在resultmap中声明typehandler且查询指定resultmap。

MyBatis 本身不自动识别数据库的 JSON 字段类型,必须显式配置类型处理器(TypeHandler)才能完成 JSON 字符串与 Java 对象之间的双向转换。核心在于让 MyBatis 知道:读取时把数据库里的 JSON 字符串反序列化为 Java 对象,写入时把 Java 对象序列化为 JSON 字符串存入字段。
实体类中正确标注 typeHandler
使用 @TableField 注解指定字段的类型处理器,最常用的是 MyBatis-Plus 提供的 JacksonTypeHandler(需引入 Jackson 依赖)或 FastjsonTypeHandler(需引入 Fastjson)。例如:
-
映射为 JSONObject(Hutool 或 Alibaba FastJSON):
@TableField(typeHandler = FastjsonTypeHandler.class) -
映射为 List 或自定义对象(如 AddressVO):
@TableField(typeHandler = JacksonTypeHandler.class) -
映射为 Map
同样适用,无需额外定义 VO 类
必须开启 autoResultMap(MyBatis-Plus 关键一步)
仅加 typeHandler 不够——MyBatis-Plus 默认不会为注解字段自动生成 resultMap。必须在实体类顶部加上:
使用 JSON Schema 验证 JSON 数据,从示例 JSON 生成 schema,并将其转换为 TypeScript 接口、Python 数据类或 Markdown 文档。
@TableName(value = "user", autoResultMap = true)- 否则
typeHandler配置完全不生效,字段始终为 null
XML 方式:手动定义 resultMap(兼容原生 MyBatis)
若项目使用 XML 映射文件(非纯注解),可在 <resultmap></resultmap> 中显式声明 typeHandler:
<result property="profile" column="profile" typehandler="com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler"></result>- 查询语句需明确指定
resultMap="xxx",不能只写resultType - 这种方式绕过
autoResultMap限制,适合混合使用场景
注意事项与常见问题
数据库字段类型不影响 Java 层处理逻辑(MySQL 的 JSON、LONGTEXT,PostgreSQL 的 JSONB 均可统一按字符串读取):
- 字段值为
NULL时,Java 对象对应属性为null,不是空对象 - JSON 字符串格式非法(如多出逗号、引号不闭合)会导致反序列化失败,抛
JsonProcessingException - 若用自定义 VO 类,确保有无参构造器和 getter/setter;泛型集合建议用
Map或JSONObject降低耦合
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










