MyBatis-Plus + MySQL JSON 字段处理

🔍 问题现象

数据库中 lesson_plan_record.content 字段存储的是合法 JSON(类型为 JSON)。

但在 Java 端通过 MyBatis-Plus 查询时,content 字段始终为 null。

MyBatis 日志显示该列值为 <<BLOB>>,说明 JDBC 将其视为二进制数据。

🧩 根本原因

  1. MySQL 的 JSON 类型在 JDBC 中以 BLOB 形式返回

即使字段定义为 JSON,底层仍按 BLOB 传输。

调用 ResultSet.getString("content") 会返回 null,无法直接获取字符串。

  1. MyBatis-Plus 默认不调用自定义 TypeHandler

虽然你写了 @TableField(typeHandler = LessonPlanContentTypeHandler.class),

但 未启用 autoResultMap = true,导致 MyBatis-Plus:

不生成 <resultMap>

忽略 typeHandler

直接跳过复杂类型字段 → content = null

💡 换句话说:你的 TypeHandler 根本没被执行!

✅ 正确解决方案

步骤 1:在实体类上启用自动 ResultMap

Java

编辑

1@TableName(value = "lesson_plan_record", autoResultMap = true) // ⭐ 关键!

2public class LessonPlanRecord {

3 // ...

4}

步骤 2:确保 TypeHandler 能处理 BLOB 类型

使用 rs.getObject() 读取原始数据,并兼容 byte[] / Blob / String:

Java

编辑

1@Override

2public AiGeneratedLessonPlan getNullableResult(ResultSet rs, String columnName) throws SQLException {

3 Object obj = rs.getObject(columnName); // ✅ 正确方式

4 return parseObject(obj);

5}

步骤 3:重启应用,验证结果

📌 关键知识点

概念 说明

autoResultMap = true 启用后,MyBatis-Plus 才会为复杂字段生成 <resultMap> 并应用 typeHandler

MySQL JSON 类型 在 JDBC 中默认作为 BLOB 返回,不能直接用 getString()

getObject() vs getString() 处理 JSON/BLOB 字段必须用 getObject()

✅ 最终效果

成功从数据库读取 JSON 字段

自动反序列化为 AiGeneratedLessonPlan 对象

前端收到完整的教案内容,不再为 null

❌ 常见误区

"我写了 typeHandler 就应该生效" → 错!必须配合 autoResultMap = true

"字段是 JSON 类型,肯定能当字符串读" → 错!JDBC 返回的是 BLOB

"只改一个 getNullableResult 方法就行" → 错!MyBatis-Plus 调用的是按列名的版本

相关推荐
卓怡学长9 分钟前
w1基于springboot高校学生评教系统
java·spring boot·tomcat·maven·intellij-idea
大佐不会说日语~41 分钟前
Spring AI Alibaba 的 Function Calling 使用 @Tool 调用中,无法获取用户ID踩坑记录
java·人工智能·spring boot·spring·alibaba·function
阿丰资源1 小时前
java项目-基于SpringBoot+MySQL+Vue的前后端分离宠物商店系统(附资料)
java·spring boot·mysql
java1234_小锋11 小时前
Java高频面试题:Springboot的自动配置原理?
java·spring boot·面试
陌殇殇12 小时前
001 Spring AI Alibaba框架整合百炼大模型平台 — 快速入门
人工智能·spring boot·ai
还在忙碌的吴小二14 小时前
Harness 最佳实践:Java Spring Boot 项目落地 OpenSpec + Claude Code
java·开发语言·spring boot·后端·spring
ai产品老杨15 小时前
异构计算时代的视频底座:基于 ZLMediaKit 与 Spring Boot 的 X86/ARM 跨平台架构解析
arm开发·spring boot·音视频
老神在在00115 小时前
Spring Boot 全局异常处理器(GlobalExceptionHandler)
spring boot·spring·java-ee·状态模式·
han_hanker16 小时前
@GetMapping @PostMapping @DeleteMapping @PutMapping
spring boot