美文网首页
mybatis中操作json类型数据

mybatis中操作json类型数据

作者: zhengaoly | 来源:发表于2022-11-17 13:37 被阅读0次

mybatis中操作json类型数据

mysql使用json类型字段保存数据,使用mybatis进行新增、查询操作,实现字段映射转换

  1. 自定义TypeHandler
    package com.xxx.xxx.handler; 
    import java.io.IOException;  
    import java.sql.CallableStatement;  
    import java.sql.PreparedStatement;  
    import java.sql.ResultSet;  
    import java.sql.SQLException;  
      
    import com.fasterxml.jackson.core.JsonProcessingException;  
    import com.fasterxml.jackson.databind.DeserializationFeature;  
    import com.fasterxml.jackson.databind.ObjectMapper;  
    import lombok.extern.slf4j.Slf4j;  
    import org.apache.ibatis.exceptions.PersistenceException;  
    import org.apache.ibatis.type.BaseTypeHandler;  
    import org.apache.ibatis.type.JdbcType;  
    import org.apache.ibatis.type.MappedJdbcTypes;  
    
    /**
     1. @ModifyTime 2021/11/25
     2. JSON 字段类型处理器
     **/
    @Slf4j
    @MappedJdbcTypes(JdbcType.VARCHAR)
    public class JacksonTypeHandler<T extends Object> extends BaseTypeHandler<T> {
        private static ObjectMapper objectMapper;
        private Class<T> type;

        static {
            objectMapper = new ObjectMapper();
            objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        }
    
        public JacksonTypeHandler(Class<T> type) {
            if (log.isTraceEnabled()) {
            log.trace("JacksonTypeHandler(" + type + ")");
            }
            if (null == type) {
                throw new PersistenceException("Type argument cannot be null");
            }
        this.type = type;
        }
    
        private T parse(String json) {
            try {
            if (json == null || json.length() == 0) {
                    return null;
                }
                return objectMapper.readValue(json, type);
            } catch (IOException e) {
            throw new RuntimeException(e);
            }
        }
    
        private String toJsonString(T obj) {
            try {
            return objectMapper.writeValueAsString(obj);
        } catch (JsonProcessingException e) {
            throw new RuntimeException(e);
          }
      }

    @Override
        public T getNullableResult(ResultSet rs, String columnName) throws SQLException {
            return parse(rs.getString(columnName));
    }

    @Override
    public T getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        return parse(rs.getString(columnIndex));
        }
    
        @Override
        public T getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
            return parse(cs.getString(columnIndex));
        }
    
        @Override
        public void setNonNullParameter(PreparedStatement ps, int columnIndex, T parameter, JdbcType jdbcType)
                throws SQLException {
            ps.setString(columnIndex, toJsonString(parameter));
        }
    }
  1. yml配置文件中添加配置
mybatis:
  mapper-locations: classpath:mapper/*.xml
  type-handlers-package: com.xx.xx.handler
  1. 在mapper文件中编写对应的字段映射规则
<result column="parameter" property="parameter" jdbcType="VARCHAR"
                typeHandler="com.xx.xx.handler.JacksonTypeHandler"/> 
                //指定返回信息使用该Typehandler
    `parameter` = #{parameter,javaType=com.xx.xx.entity.ParameterEntity, typeHandler=com.xx.xx.handler.JacksonTypeHandler},
    //新增或修改时指定该字段对应的对象类型、以及Typehandler
  1. 结果
    
    //新增结果
    {
        "code": 200,
        "msg": "操作成功",
        "data": {
            "id": "9c43257c-90ff-464d-aa84-43784b728c06",
            "name": "string",
            "parameter": [
                {
                    "name": "新增的参数",
                    "type": 1
                },
                {
                    "name": "新增的参数",
                    "type": 1
                }
            ],
            "createTime": "2021-11-25T11:54:24.577+08:00",
            "updateTime": "2021-11-25T11:54:24.577+08:00"
        }
  }
//查询结果
{
  "code": 200,
   "msg": "操作成功",
   "data": [
     {
       "id": "2ecb88f6-c99c-4877-ade5-72c3081b6009",
       "name": "string",
       "parameter": [
         {
           "name": "新增的参数",
           "type": 1
         },
         {
           "name": "新增的参数",
           "type": 1
         }
       ],
       "createTime": "2021-11-25T00:00:00.000+08:00",
       "updateTime": "2021-11-25T00:00:00.000+08:00"
     },
     {
       "id": "65e0a272-4267-4ea8-a89b-79e811ca2e17",
       "name": "string2",
       "parameter": [
         {
           "name": "新增的参数",
           "type": 1
         },
         {
           "name": "新增的参数",
           "type": 1
         }
       ],
       "createTime": "2021-11-25T00:00:00.000+08:00",
       "updateTime": "2021-11-25T00:00:00.000+08:00"
     }
   ]
 }

文章知识点与官方知识档案匹配,可进一步学习相关知识

Java技能树
使用JDBC操作数据库
JDBC概述

相关文章

  • MySQL之JSON数据类型CRUD

    JSON数据类型: 从mysql5.7.8开始开始支持,json数据类型。可以通过客户端创建json字段表并操作检...

  • 2020-09-01 MySQL中Json中key随机排序解决方

    背景: 在MySQL中,是有json字段类型的,同时也有json操作的相关方法,也提供json数据的校验,给我们保...

  • Mybatis 数据类型对应MySQL

    Mybatis 数据类型对应MySQL 1、MyBatis 通过包含的jdbcType类型 2、Mybatis中j...

  • MySQL JSON格式数据应用

    1、创建数据库表 指定类型为json类型 2、mybatis配置文件设置 指定typeHandler为FastJs...

  • SQL中的JSON数据类型

    SQL中的JSON数据类型 概述 MySQL支持原生JSON类型,使用JSON数据类型相较于将JSON格式的字符串...

  • FreeMaker遇到JSON格式数据

    FreeMaker渲染JSON格式数据: 先判断JSON数据是否为字符串。根据类型做不同的渲染操作

  • MySQL JSON类型

    MySQL支持JSON数据类型。相比于Json格式的字符串类型,JSON数据类型的优势有: 存储在JSON列中的J...

  • 数据绑定及回流

    JSON数据操作 JSON不是一个单独的数据类型,他只是一种特殊的数据格式,是对象数据类型的相对普通对象来说,JS...

  • mysql json

    对mysql中json类型的字段查询操作

  • 数据库

    数据库类型与pojo中属性类型的对应 Mybatis与数据库的类型对应

网友评论

      本文标题:mybatis中操作json类型数据

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