Jackson处理和mybatis的xml转换问题

复制代码
我在开发的时候遇到Jackson处理和mybatis的xml转换问题。大致是插入数据和跟新数据的时候失败,javaType (java.util.List) : jdbcType (null) combination.大概意思是找不到这个Java类型。触发原因。是这个字段存的是数组的map集合,前端前后端的交互格式字符串[{key,value},{key,value},{key,value}...],其实就是list<map>嵌套。然后后端业务要拿这个字段做业务处理,索性用Jackson处理,打上@Data,就能调用属性了,但是存数据和取数据,修改不注意声名,高数mybatis,他就不知道转换了。
因为:

MyBatis 团队(Apache)

不认识

Jackson 团队(FasterXML)

报错情况和解决方法如下。

📌 报错信息

复制代码
Error updating database. Cause: java.lang.IllegalStateException: Type handler was null on parameter mapping for property 'measureItem'. 
It was either not specified and/or could not be found for the javaType (java.util.List) : jdbcType (null) combination.

📋 控制台完整输出

复制代码
### Error updating database.  Cause: java.lang.IllegalStateException: Type handler was null on parameter mapping for property 'measureItem'. It was either not specified and/or could not be found for the javaType (java.util.List) : jdbcType (null) combination.
### The error may exist in file [D:\Auser\fangzheng\target\classes\mapper\PartMapper.xml]
### The error may involve com.yrsy.gmvs.dal.mapper.PartMapper.insertPart
### The error occurred while setting parameters
### SQL: insert into part (part_id, part_name, measure_item, status, remark, create_by, create_time) values (?, ?, ?, ?, ?, ?, ?)
### Cause: java.lang.IllegalStateException: Type handler was null on parameter mapping for property 'measureItem'. It was either not specified and/or could not be found for the javaType (java.util.List) : jdbcType (null) combination.

🔍 出错原因分析

1. 数据类型

measureItem 字段在数据库中是 varchar 类型,存的是 JSON 字符串:

json 复制代码
[{"itemNum":1,"name":"同轴度"},{"itemNum":2,"name":"跳动度"}]

但在 Java 实体类中,measureItemList<Map<String, Object>> 类型:

java 复制代码
@TableField(value = "measure_item", typeHandler = JacksonTypeHandler.class)
private List<Map<String, Object>> measureItem;

2. 问题根源

MyBatis 在执行 insertupdate 时,需要将 List 类型转换成数据库能存储的 varchar 类型。

但是,MyBatis 默认不知道如何把 List 转成 JSON 字符串

3. 为什么实体类注解不生效?

java 复制代码
@TableField(value = "measure_item", typeHandler = JacksonTypeHandler.class)
private List<Map<String, Object>> measureItem;

@TableField 注解中的 typeHandler 属性,只在 MyBatis-Plus 的 BaseMapper(如 insert()updateById())中生效。如果使用自定义的 XML Mapper,MyBatis-Plus 的注解不会被识别。

4. 错误发生位置

PartMapper.xml 中的插入语句没有指定 typeHandler

xml 复制代码
<insert id="insertPart" parameterType="PartDO">
    INSERT INTO part (measure_item) 
    VALUES (#{measureItem})  <!-- ❌ 没有指定 typeHandler -->
</insert>

MyBatis 看到 List 类型,却找不到对应的 TypeHandler,抛出 IllegalStateException


✅ 修复方案

方法1:在 XML 中指定 typeHandler(推荐)

xml 复制代码
<insert id="insertPart" parameterType="PartDO" useGeneratedKeys="true" keyProperty="id">
    INSERT INTO part (
        part_id, part_name, measure_item, status, remark,
        create_by, create_time, update_by, update_time
    ) VALUES (
        #{partId},
        #{partName},
        <!-- ✅ 关键修复:指定 TypeHandler -->
        #{measureItem, typeHandler=com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler},
        #{status},
        #{remark},
        #{createBy},
        #{createTime},
        #{updateBy},
        #{updateTime}
    )
</insert>

方法2:同时修复 update 语句

xml 复制代码
<update id="updatePart" parameterType="PartDO">
    UPDATE part
    <set>
        <if test="partId != null">part_id = #{partId},</if>
        <if test="partName != null">part_name = #{partName},</if>
        <!-- ✅ 这里也要加 -->
        <if test="measureItem != null">
            measure_item = #{measureItem, typeHandler=com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler},
        </if>
        <if test="status != null">status = #{status},</if>
        <if test="remark != null">remark = #{remark},</if>
        <if test="updateBy != null">update_by = #{updateBy},</if>
        <if test="updateTime != null">update_time = #{updateTime},</if>
    </set>
    WHERE id = #{id}
</update>

方法3:改用 MyBatis-Plus BaseMapper(可选)

如果不想每次都在 XML 里写 typeHandler,可以让 PartMapper 继承 BaseMapper<PartDO>

java 复制代码
@Mapper
public interface PartMapper extends BaseMapper<PartDO> {
    // 不需要自定义 XML,直接用 baseMapper.insert(partDO)
}

此时 @TableField(typeHandler = JacksonTypeHandler.class) 会自动生效。


📝 核心知识点

知识点 说明
TypeHandler 是什么 MyBatis 中用于 Java 类型与 JDBC 类型转换的处理器
JacksonTypeHandler MyBatis-Plus 提供的 TypeHandler,用于将 List/Map 转成 JSON 字符串存库
何时需要指定 使用自定义 XML Mapper 时,需要在 #{字段} 中显式指定 typeHandler
何时自动生效 使用 MyBatis-Plus 的 BaseMapper 时,@TableField 注解中的 typeHandler 会自动生效

🎯 总结

  1. 报错原因 :MyBatis 不认识 List 类型,无法将其转换为 JSON 字符串存入数据库
  2. 出错位置PartMapper.xml 中的 insertPartupdatePart 语句
  3. 修复方式 :在 #{measureItem} 后追加 typeHandler=com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler
  4. 核心原因 :自定义 XML Mapper 不识别实体类上的 @TableField 注解

本文由实战踩坑总结,希望能帮助到遇到同样问题的开发者。 🎯

相关推荐
CodeStats1 小时前
【Spring事务】Spring事务注解 @Transactional 完整体系:从 MySQL 隔离级别到 MyBatis 原理详解
java·spring·mybatis·事务·transactional
Nuanyt12 小时前
SSM 学习记录 第二部分 Spring整合Mybatis&Junit AOP核心概念 Spring事务管理 SpringMVC 请求与响应 Rest风格
java·spring·junit·mybatis·restful
米码收割机12 小时前
【SSM】Spring MVC_MyBatis SSM商城系统(源码+论文)【独一无二】
spring·mvc·mybatis
Devin~Y2 天前
互联网大厂 Java 面试实录:Spring Boot、MyBatis、Redis、Kafka、Spring Security、RAG 与 MCP 全链路问答
java·redis·kafka·mybatis·spring security·spring mvc·sprint boot
VX_bysjlw9852 天前
基于微信小程序的宠物用品商城系统-后端74346-计算机毕设原创(免费领源码+带部署教程)
java·redis·微信小程序·eclipse·mybatis·idea·微信开发者工具
hexu_blog2 天前
springboot3集成shardingsphere4.0 分表分库
java·spring boot·mybatis
乐观的Terry2 天前
9、发布系统-Webhook自动发布
java·spring boot·spring·spring cloud·mybatis
聆听。。花开雨落3 天前
mybatis的typeHandler 作用
数据库·mybatis
前网易架构师-高司机4 天前
带标注的扑克牌识别数据集,识别率99.5%,3083张图,支持yolo,coco json,voc xml,文末有模型训练代码
xml·yolo·json·数据集·数字·扑克牌·纸牌
执明wa4 天前
LayoutInflater详解: XML是如何变成View的?
android·xml·开发语言·android studio