Spring boot项目配置mybatis支持MySQL的json数据格式

本文介绍了mysql 5.7版本以后支持原生json格式,基于Spring boot进行配置说明。指出mybatis支持mysql的json格式,需mysql驱动版本大于等于5.1.40,还说明了自定义json类型处理器、配置类型处理器、mapper配置文件等步骤,最后提到mysql支持基于json字段的查询。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

mysql5.7版本以后支持原生json格式,基于Spring boot进行配置说明。

mybatis支持mysql的json格式

mysql-connector,mysql的驱动版本要大于等于5.1.40,否则json字段查询会发生乱码。
继承BaseTypeHandler自定义一个json类型处理器,放到一个handler包下,例:



package com.c.config.handler;

import com.alibaba.fastjson.JSONObject;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedJdbcTypes;
import org.apache.ibatis.type.MappedTypes;

import java.sql.*;

/**
 * @description 用以mysql中json格式的字段,进行转换的自定义转换器,转换为实体类的JSONObject属性
 */
@MappedTypes(JSONObject.class)
@MappedJdbcTypes(JdbcType.VARCHAR)
public class MySqlJsonHandler extends BaseTypeHandler<JSONObject> {

    /**
     * 设置非空参数
     * @param ps
     * @param i
     * @param parameter
     * @param jdbcType
     * @throws SQLException
     */
    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, JSONObject parameter, JdbcType jdbcType) throws SQLException {
        ps.setString(i, String.valueOf(parameter.toJSONString()));
    }

    /**
     * 根据列名,获取可以为空的结果
     * @param rs
     * @param columnName
     * @return
     * @throws SQLException
     */
    @Override
    public JSONObject getNullableResult(ResultSet rs, String columnName) throws SQLException {
        String sqlJson = rs.getString(columnName);
        if (null != sqlJson){
            return JSONObject.parseObject(sqlJson);
        }
        return null;
    }

    /**
     * 根据列索引,获取可以为空的结果
     * @param rs
     * @param columnIndex
     * @return
     * @throws SQLException
     */
    @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;
    }
}

配置自定义的类型处理器,配置文件中加入:

#配置mybaits自定义类型转换类所在的包
mybatis.type-handlers-package=com.c.config.handler

mapper的配置文件,利用属性typeHandler,例:

<!-- resultMap中配置实体类json属性字段 -->
<resultMap id="entityMap" type="com.c.entity.TrafficRestriction">
   、、、
    <!-- 实体类的json字段,typeHandler指定自定义的typeHandler -->
    <result column="rule" property="rule" typeHandler="com.c.config.handler.config.MySqlJsonHandler"/>
    、、、
</resultMap>

<!-- 保存时的配置 -->
<insert id="save" parameterType="com.c.TrafficRestriction">
    <!-- 指定rule的typeHandler -->
    insert into table (rule) values (#{rule,jdbcType=OTHER,typeHandler=com.c.handler.config.MySqlJsonHandler})
</insert>

实体类TrafficRestriction中rule字段类型为:com.alibaba.fastjson.JSONObject(当然也可以用其他工具的JSONObject)。配置完成后,保存、查询,rule字段就和普通字段一样,自动进行转换了。MySQL数据库中rule这一列,创建类型为:json。
mysql还支持基于json字段的查询。

作者:Knight_9
链接:https://www.jianshu.com/p/700452aaae8c

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值