could not be found for the javaType (com.alibaba.fastjson.JSONObject) : jdbcType (null) combination

数据库使用JSON字段,mybatis错误

目前mysql5.7已经支持了JSON属性的字段。但是在使用mybatis对这种类型的字段进行接取的时候,会发现jdbcYype中并没有JSON属性,之前在网上搜索了很多方法,但大多都有重复或方法不可行,这里记录一下实现的具体过程。

使用流程

在使用mybatis进行接收的时候,由于jdbcType中不存在JSON字段,所以使用jdbcType中的OTHER类型,同时使用typeHandler对数据进行自行转换,相关配置实现大体如下:

<resultMap type="com.test.testone.use.entity.DmpRuleSetsEntity" id="UserAppsMap">
        <result property="id" column="id" jdbcType="INTEGER"/>
        <result property="name" column="name" jdbcType="VARCHAR"/>
        <result property="data" column="data" jdbcType="OTHER" typeHandler="com.test.testone.use.util.ObjectJsonHandler"/>
    </resultMap>

在xml中加入handler的相关配置,进行实现,这里放入一个我自己使用的Handler以供大家参考。

@MappedTypes(JSONObject.class)
@MappedJdbcTypes(JdbcType.VARCHAR)
public class ObjectJsonHandler extends BaseTypeHandler<JSONObject>{

    //设置非空参数
    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, JSONObject parameter, JdbcType jdbcType) throws SQLException {
        ps.setString(i, String.valueOf(parameter.toJSONString()));
    }
    //根据列名,获取可以为空的结果
    @Override
    public JSONObject getNullableResult(ResultSet rs, String columnName) throws SQLException {
        String sqlJson = rs.getString(columnName);
        if (null != sqlJson){
            return JSONObject.parseObject(sqlJson);
        }
        return null;
    }
    //根据列索引,获取可以为空的结果
    @Override
    public JSONObject getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        String sqlJson = rs.getString(columnIndex);
        if (null != sqlJson){
            return JSONObject.parseObject(sqlJson);
        }
        return null;
    }

    @Override
    public JSONObject getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        String sqlJson = cs.getString(columnIndex);
        if (null != sqlJson){
            return JSONObject.parseObject(sqlJson);
        }
        return null;
    }

在配置完如上代码后,许多同学在使用的过程中发现,在本地测试没问题的情况下,换测试环境可能会出现如下错误:
could not be found for the javaType (com.alibaba.fastjson.JSONObject) : jdbcType (null) combination.
这个错误说jdbcType没有进行指明,需要指明jdbcType。但是在上面我们明明对data的类型进行了设置。

解决方案

这是由于在设置jdbcType为OTHER属性后,代码仍需要对具体的sql语句中涉及到的相关字段进行设置,比如:

update tablename
        set name = #{name},
            data = #{data,jdbcType=OTHER,typeHandler=com.test.testone.use.util.ObjectJsonHandler}
        where id = #{id}

通过这样的设置,我们就可以在代码中使用mybatis对数据库中的JSON字段进行操作

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐