Mybatis和Mysql的Json类型

Mysql5.7新增加了Json类型字段,但是目前Mybatis中并不支持

1.新建MybatisJsonTypeHandler.java

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedJdbcTypes;

//import org.apache.ibatis.type.BaseTypeHandler;
//import org.apache.ibatis.type.JdbcType;
//import org.codehaus.jackson.map.ObjectMapper;
//import org.codehaus.jackson.map.SerializationConfig.Feature;
//import org.codehaus.jackson.map.annotate.JsonSerialize.Inclusion;

import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

/**
 * Author  : Randy
 * Date    : 2018-06-28  12:55
 * Comment :
 */
@MappedJdbcTypes(JdbcType.VARCHAR)
public class MybatisJsonTypeHandler<T extends Object> extends BaseTypeHandler<T> {

    private static final ObjectMapper mapper = new ObjectMapper();
    private Class<T> clazz;

    public MybatisJsonTypeHandler(Class<T> clazz) {
        if (clazz == null) throw new IllegalArgumentException("Type argument cannot be null");
        this.clazz = clazz;
    }

    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType) throws SQLException {
        ps.setString(i, this.toJson(parameter));
    }

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

    @Override
    public T getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        return this.toObject(rs.getString(columnIndex), clazz);
    }

    @Override
    public T getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        return this.toObject(cs.getString(columnIndex), clazz);
    }

    private String toJson(T object) {
        try {
            return mapper.writeValueAsString(object);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    private T toObject(String content, Class<?> clazz) {
        if (content != null && !content.isEmpty()) {
            try {
                return (T) mapper.readValue(content, clazz);
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        } else {
            return null;
        }
    }

    static {
        mapper.configure(JsonParser.Feature.ALLOW_MISSING_VALUES, false);
        mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
    }
}

2.在mybatis-config.xml中注册该Handler

    <typeHandlers>
        <typeHandler handler="com.demo.handler.MybatisJsonTypeHandler"
                     javaType="com.demo.dto.ReportDataDto"/>
    </typeHandlers>

3.在mapper sql map中如下,其中content为mysql中的json类型字段

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.demo.mapper.ReportDataMapper" >

    <resultMap id="BaseResultMap" type="com.demo.dto.ReportDataDto" >
        <id column="id" property="id" jdbcType="BIGINT" />
        <id column="content" property="content" jdbcType="VARCHAR" typeHandler="com.demo.common.MybatisJsonTypeHandler"/>
    </resultMap>

    <sql id="Base_Column_List" >
        id,
        create_time createTime,
        command_id commandId ,
        content,
        partition_key partitionKey
    </sql>

    <insert id="insert" parameterType="com.demo.dto.DataDto">
        insert into data(
            id,
            create_time,
            command_id,
            content,
            partition_key
        ) values (
              #{id},
              #{createTime},
              #{commandId},
              #{content,typeHandler=com.demo.common.MybatisJsonTypeHandler},         #{partitionKey}        )      </insert> </mapper>

  

  

  

原文地址:https://www.cnblogs.com/qizhelongdeyang/p/9240600.html

时间: 2024-10-11 21:30:37

Mybatis和Mysql的Json类型的相关文章

MySQL对JSON类型UTF-8编码导致中文乱码探讨

前言 继上文发表之后,结合评论意见并亲自验证最终发现是编码的问题,但是对于字符编码还是有点不解,于是乎,有了本文,我们来学习字符编码,在学习的过程中,我发现对于MySQL中JSON类型的编码导致数据中文出现乱码还有可深挖之处,接下来我们来分析一下,若有错误之处,还请批评指出. 字符编码 评论中指出任何不在基本多文本平面的Unicode字符,都无法使用MySQL的utf8字符集存储,包括Emoji 表情(Emoji 是一种特殊的Unicode 编码,常见于IOS和Android 手机上)和很多不常

mybatis查询mysql的datetime类型数据时间差了14小时

今天使用mybatis查询mysql中的数据时,莫名其妙的所有时间都出错了,所有时间都比数据库时间多了14小时,考虑了一下,初步判定是系统时区的问题.因为mysql时区设置默认是操作系统时区,查看了下centos时区,东8区没有错,所以可以判定是代码里面设置了一个错误的时区. 现在开始调试mybatis源码,调试到mysql-connector-java-6.0.4.jar包的com.mysql.cj.jdbc.io.JdbcTimestampValueFactory的createFromTim

mysql 查询json类型数据

如果 t1表里有一个extra字段,字段是text类型,数据为json格式  {"value":"XMjgxIqqqqqqqqqq"} 如何获取json里面value对于的值呢? JSON_EXTRACT(t1.extra,'$.value') 得到 "XMjgxIqqqqqqqqqq" 原始sql和原始结果 select t1.id AS item_id, t1.title AS item_name,t6.id AS topic_id, t6.

Mybatis深度整合Mysql的Json字段

概述以前当业务数据结构变化时,往往需要采用的方案是:?修改表结构增加字段?遇到数据结构有list结构时,新建1对多的关联子表?用字典表表示字段的增加以上方案对代码侵入性很强,同时与旧业务数据结构不兼容.导致代码从实体类.Dao.Service.Controller层都要修改. 随着NOSQL数据库的广泛应用,可扩展的存储方式在关系型数据库中也有了很好的支持,最新的MySQL5.7中就新增加了一个数据类型JSON,使用mysql的json类型字段做扩展字段,可以以json串形式动态的存储任意结构的

mybatis存取mysql中的json

mysql 5.7后新增了一个json类型字段,以往json入库都是转字符串,取到前端造成了不少困扰.今天就做了个小例子把这个整合到ssm例子中. 这里插句题外话,因为最近开始改用idea,配置项目的时候出了一大堆问题,这边也顺便说下如果idea在启动tomcat客户端控制台出现乱码处理办法 打开idea安装目录-bin用记事本打开idea.exe.vmoptions和idea64.exe.vmoptions文件在文件后面添加一行:-Dfile.encoding=UTF-8 好了进入整体 第一步

使用mysql innodb 使用5.7的json类型遇到的坑和解决办法

---------------------------------------------- #查询JSON的某个字段 select data -> '$.Host' from temp #创建虚拟列 ALTER TABLE temp ADD host varchar(128) GENERATED ALWAYS AS (json_extract(data,'$.Host')) VIRTUAL; #给虚拟列创建索引 ALTER TABLE temp ADD INDEX index_temp_hos

MySQL 5.7新支持--------Json类型实战

1. 背景 * 在MySQL 5.7.8中,MySQL支持由RFC 7159定义的本地JSON数据类型,它支持对JSON(JavaScript对象标记)文档中的数据进行有效访问. * MySQL会对DML JSON数据自动验证.无效的DML JSON数据操作会产生错误. * 优化的存储格式.存储在JSON列中的JSON文档转换为一种内部格式,允许对Json元素进行快速读取访问. * MySQL Json类型支持建立索引增加查询性能提升. 2. Json类型所需的存储空间和值范围 类型 占用字节

使用Python向MySQL数据库中存入json类型数据

0.说明 因为出于个人项目的需要,获取到的数据都是json类型的,并且都要存入MySQL数据库中,因为json类型数据不像一般的文本数据,所以在存入MySQL时需要注意的问题很多. 在网上找了很多方法,整理了一下比较实用可靠的,总结下来就是下面的过程: MySQL表中需要保证存储json数据的列类型为BLOB: 使用sql语句时,使用MySQLdb.excape_string函数来对json数据进行转义: 查询数据时,将结果使用json.loads就能够得到原来的Python数据类型: 下面就来

Mysql json类型

5.7版本支持原生json类型代替BLOB类型json数据有效性检查查询性能提升:不需要遍历所有字符串才能找到数据支持部分属性索引 1. json格式范例 2. 结构化与非结构化 结构化:二维表结构(行和列) ? 使用SQL语句进行操作非结构化:使用Key-Value格式定义数据,无结构定义 ? Value可以嵌套Key-Value格式的数据 ? 使用JSON进行实现 SQL创建User表create table user (id bigint not null auto_increment,