美文网首页Spring Cloud 相关文章技术
mybatis支持json,Spring boot配置

mybatis支持json,Spring boot配置

作者: Knight_9 | 来源:发表于2018-11-23 14:24 被阅读0次
    • mysql5.7版本以后支持原生json格式,基于Spring boot进行配置说明。

    mybatis支持mysql的json格式

    1. mysql-connector,mysql的驱动版本要大于等于5.1.40,否则json字段查询会发生乱码。
    2. 继承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;
        }
    }
    
    1. 配置自定义的类型处理器,配置文件中加入:
    #配置mybaits自定义类型转换类所在的包
    mybatis.type-handlers-package=com.c.config.handler
    
    1. 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>
    
    1. 实体类TrafficRestriction中rule字段类型为:com.alibaba.fastjson.JSONObject(当然也可以用其他工具的JSONObject)。配置完成后,保存、查询,rule字段就和普通字段一样,自动进行转换了。MySQL数据库中rule这一列,创建类型为:json。
    2. mysql还支持基于json字段的查询。

    相关文章

      网友评论

        本文标题:mybatis支持json,Spring boot配置

        本文链接:https://www.haomeiwen.com/subject/xquxqqtx.html