小工具      在线工具  汉语词典  css  js  c++  java

SpringBoot 存储JSON数据到Mysql对应的JSON字段

Java 额外说明

收录于:93天前

1.Gson介绍

<dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
        </dependency>

2.定义要存储的JSON字段

@Data
public class LJUserExt implements Serializable {

    private static final long serialVersionUID = -1464964389043519003L;

    private String daughter;

    private String wife;
}
@Data
public class LJUser implements Serializable {

    private static final long serialVersionUID = -4002400177569822816L;
    /**
     * 主键
     */
    private  int  userId;

    private String userName;

    private String tel;

    private String passwd;

    private String picUrl;

    private String orgCode;

    private String orgName;

    private LJUserExt ext; //存储的JSON字段
}

3.定义转换器,建议引用mybatis sql文件。

package com.robinboot.service.utils.typehandler;


import com.alibaba.fastjson.annotation.JSONField;
import com.fasterxml.jackson.annotation.JsonIgnore;
import sun.reflect.generics.reflectiveObjects.TypeVariableImpl;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.lang.reflect.TypeVariable;
import java.util.Arrays;
import java.util.Optional;

/**
 * interface版本的TypeToken
 * @param <T>
 */
public interface GenericTypeIdentified<T> {


    default Type getType() {
        return getType(getClass());
    }

    default Type getType(Class<?> clazz) {

        Type[] interfaces = clazz.getGenericInterfaces();
        Optional<Type> opInterfaces = Arrays.stream(interfaces)
                .filter(i -> i instanceof ParameterizedType &&
                        ((ParameterizedType) i).getRawType().equals(GenericTypeIdentified.class))
                .findAny();
        Class<?> superClazz = clazz.getSuperclass();
        if (!opInterfaces.isPresent()) {
            if (superClazz == Object.class)
                return null;
            Type tmpT = getType(superClazz);
            if (tmpT == null || tmpT instanceof TypeVariable) { //泛型继承被擦除
                if (clazz.getGenericSuperclass() instanceof ParameterizedType)
                    // 直接拿取最近父类泛型,这里有坑,因为没有判断继承关系中,如果有多个泛型参数,所要识别的泛型参数的位置
                    // 这里直接用了下标0的具体类型
                    return ((ParameterizedType) clazz.getGenericSuperclass()).getActualTypeArguments()[0];
                return null;
            }
            return tmpT;
        }
        return ((ParameterizedType) opInterfaces.get()).getActualTypeArguments()[0];
    }

    @JSONField(serialize = false)
    @JsonIgnore
    default Class<T> getGenericTypeClass() {
        Type genericType = getType();
        return unwrapClass(genericType);
    }

    @SuppressWarnings("unchecked")
    default Class<T> unwrapClass(Type genericType) {
        if (genericType == null)
            return null;
        if (genericType instanceof ParameterizedType) {
            ParameterizedType pt = (ParameterizedType) genericType;
            return (Class<T>) pt.getRawType();
        } else if (genericType instanceof TypeVariableImpl) {
            // 如果得到的是泛型参数,说明泛型赋给对象,运行时擦除,尝试获取上下边界返回
            Type[] bounds = ((TypeVariableImpl) genericType).getBounds();
            if (bounds == null || bounds.length == 0)
                return null;
            return unwrapClass(bounds[0]);
        } else try {
            return (Class<T>) genericType;
        } catch (Exception e) {
            return null;
        }
    }
}
package com.robinboot.service.utils.typehandler;

import com.google.gson.Gson;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;

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


public abstract class JsonTypeHandler<T>
        extends BaseTypeHandler<T>
        implements GenericTypeIdentified<T> {

	protected Gson gson = new Gson();

    protected Class<T> clazz = getGenericTypeClass();

    @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));
    }

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

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

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

	private T toObject(String content) {
        if (content != null && !content.isEmpty()) {
            try {
                return gson.fromJson(content, clazz);
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        } else {
            return null;
        }
    }




}
package com.robinboot.service.utils.typehandler;

import com.robinboot.service.domain.LJUserExt;

/**
 * @auther: TF12778
 * @date: 2021/8/17 16:22
 * @description:
 */
public class userExtTypeHandler extends JsonTypeHandler<LJUserExt> {
}

sql文件,这里引用了ext的转换器,

typeHandler = com.robinboot.service.utils.typehandler.userExtTypeHandler
 <update id="updateUser" parameterType="com.robinboot.service.domain.LJUser">
        UPDATE user
        <set>
            <if test="userName != null and userName.toString() != ''" >userName = #{userName},</if>
            <if test="tel != null and tel.toString() != ''" >tel = #{tel},</if>
            <if test="passwd != null and passwd.toString() != ''" >passwd = #{passwd},</if>
            <if test="picUrl != null and picUrl.toString() != ''" >picUrl = #{picUrl},</if>
            <if test="orgCode != null and orgCode.toString() != ''" >orgCode = #{orgCode},</if>
            <if test="orgName != null and orgName.toString() != ''" >orgName = #{orgName},</if>
            <if test="ext != null and ext.toString() != ''" >ext = #{ext ,typeHandler = com.robinboot.service.utils.typehandler.userExtTypeHandler},</if>
        </set>
        WHERE userId = #{userId}
    </update>

4.更新用户信息的ext字段

首先看mysql中ext的格式,是json格式。

更新用户信息并存储关键信息 user.setExt(ext); // json字段

  @Override
    public Result<Integer> updateUser(LJUserDto dto) {

        if (StringUtils.isBlank(ObjectUtils.toString(dto.getUserId()))) {
            throw new ServiceException("userId不能为空", "500");
        }
        LJUserQuery query = new LJUserQuery();
        query.setUserId(dto.getUserId());
        LJUser ljUser = ljUserService.selectUserDetail(query);
        if (ljUser == null) {
            throw new ServiceException("数据为空", "500");
        }

        LJUser user = new LJUser();
        user.setUserId(dto.getUserId());

        LJUserExt ext = new LJUserExt();
        BeanUtils.copyProperties(dto, ext);
        user.setExt(ext); // json字段
        Integer i = ljUserService.updateUser(user);
        if (i == 0) {
            throw new ServiceException("更新失败", "500");
        }
        return new Result<Integer>("success", "操作成功", "0", null, "200");
    }

5、mysql中存储的JSON数据格式测试结果

以上就是将json数据存入mysql中json对应字段的整个过程

. . .

相关推荐

额外说明

SpringBoot配置文件是什么?该如何使用?

-作者简介:大家好,我是卷心菜~~,在校大二学生一枚,Java领域新星创作者。 -个人主页:卷心菜的CSDN博客 -系列专栏:本文写在SpringBoot专栏:SpringBoot知识点讲解 -如果文章知识点有错误的地方,请指正!和大家一起学习,一起进步

额外说明

wx小程序——key列表高级特性

QQ 1285575001 Wechat M010527 技术交流 QQ群599020441 纪年科技aming

额外说明

Unity中Shader光照模型Phong

文章目录 前言 一、Phong光照模型 二、图示解释Phone光照模型 1、由图可得,R 可以由 -L 加上 P 得出 2、P等于2*M 3、因为 N 和 L 均为单位向量,所以 M 的模可以由 N 和 L得出 4、得到M的模后,乘以 单位向量N,得到M

额外说明

【Rust 基础篇】Rust 智能指针

导言 在 Rust 中,智能指针是一种提供了额外功能的指针类型。智能指针可以在编译时和运行时检查内存安全,并提供了更灵活的所有权和借用模型。本篇博客将详细介绍 Rust 中的智能指针,包括常用的智能指针类型、创建和使用智能指针、内存安全和性能考虑等。 B

额外说明

[Web缺陷与修复之]Property access or function call before check for null or undefined

缺陷描述 Property access or function call before check for null or undefined,翻译以下就是: 在检查 null 或 undefined 之前进行了属性访问或函数调用,更简单点的理解就是:

额外说明

Windows系统缺少uudf.dll文件导致程序功能异常问题

其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个uudf.dll文件(挑选合

额外说明

Windows系统缺少todg6.ocx文件导致程序无法启动问题

其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个todg6.ocx文件(挑选

额外说明

初创企业购买企业邮箱_适用于初创企业的23个最佳WordPress主题

初创企业购买企业电子邮件 您是否正在为您的网站寻找 WordPress 启动主题? 您是否正在为您的网站寻找 WordPress 启动主题? 您的网站需要一个可靠的平台,可以随着您的初创公司的发展而快速扩展。您还需要一个可以让您专业地展示工作和项目的主题

额外说明

决策树C4.5算法

决策树-C4.5 前面的ID3算法已经介绍了决策树的基本概念。 C4.5算法在ID3算法的基础上进行了改进。它利用信息增益比构建决策树,并具有剪枝功能以防止过度拟合。本模块将介绍C4.5算法的决策树构建策略。 欠拟合:训练得到的模型在训练集集测试中表现就

额外说明

IDEA快捷键

Ctrl + Shift + C:复制文件路径(复制所选文件的路径) Ctrl + X:剪切(剪切选定的文本,如果未选定,则剪切当前行) Ctrl+C:复制(复制选中的文本,未选中则复制当前行) Ctrl + Shift + C:复制所选文件的路径 Ct

ads via 小工具