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 调用的是按列名的版本

相关推荐
大阿明3 小时前
Spring Boot(快速上手)
java·spring boot·后端
哆啦A梦15884 小时前
Springboot整合MyBatis实现数据库操作
数据库·spring boot·mybatis
星轨zb5 小时前
通过实际demo掌握SpringSecurity+MP中的基本框架搭建
数据库·spring boot·spring security·mp
没有bug.的程序员8 小时前
Serverless 弹性扩容引发的全线熔断:Spring Boot 启动耗时从 1s 压缩至 0.3s 的物理级绞杀
java·spring boot·kubernetes·serverless·扩容·线上
luom010210 小时前
SpringBoot - Cookie & Session 用户登录及登录状态保持功能实现
java·spring boot·后端
希望永不加班10 小时前
SpringBoot 核心配置文件:application.yml 与 application.properties
java·spring boot·后端·spring
毕设源码-朱学姐11 小时前
【开题答辩全过程】以 基于SpringBoot+Vue的百货商品进出货平台为例,包含答辩的问题和答案
java·spring boot·后端
夜空下的星12 小时前
springboot实现Minio大文件分片下载
java·spring boot·后端
ADHD多动联盟12 小时前
什么是儿童ADHD的运动干预方案?主要有怎样的应对分心走神的疗法?
学习·学习方法·玩游戏
程序员老乔15 小时前
Java 新纪元 — JDK 25 + Spring Boot 4 全栈实战(三):虚拟线程2.0,电商秒杀场景下的并发革命
java·开发语言·spring boot