Java + MySQL 实现存储完整 Json
一、应用场景
将前端传过来的 Json
完整存储到 MySQL
中,涉及技术栈为 Java
、MyBatis
、MySQL
。
注意:MySQL 5.7.8
以后才支持 json
类型。
二、数据库配置
将相应字段的类型设为 json
。
三、后端代码配置
1、maven 依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.75</version>
</dependency>
2、实体类
对应的属性使用 com.alibaba.fastjson.JSONObject
类型。
package com.example.demo.entity;
import com.alibaba.fastjson.JSONObject;
import lombok.Data;
import java.io.Serializable;
@Data
public class Test implements Serializable {
/**
* 主键
*/
private String id;
/**
* 页面数据
*/
private JSONObject jsonData;
}
3、Service 实现类
package com.example.demo.service.impl;
import com.alibaba.fastjson.JSONObject;
import com.example.demo.entity.Test;
import com.example.demo.mapper.TestMapper;
import com.example.demo.service.TestService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class TestServiceImpl implements TestService {
@Autowired
private TestMapper testMapper;
@Override
public Test getDetailById(String id) {
return testMapper.getDetailById(id);
}
@Override
public String saveTest(JSONObject req) {
Test test = new Test();
test.setJsonData(req);
testMapper.insert(test);
}
}
4、xml 文件
查询和新增都需要指明具体的 typeHandler
,不然查询会查不到数据,新增会报错。
typeHandler
的值对应实体类的 JSONObject
类型,这里是 typeHandler="com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler"
。
<?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.example.demo.mapper.TestMapper">
<resultMap id="BaseResultMap" type="com.example.demo.entity.Test">
<id property="id" column="id" jdbcType="VARCHAR"/>
<result property="jsonData" column="json_data" jdbcType="OTHER"
typeHandler="com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler"/>
</resultMap>
<insert id="insert">
insert into test
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="id != null and id != ''">id,</if>
<if test="jsonData != null">json_data,</if>
</trim>
values
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="id != null and id != ''">#{id},</if>
<if test="jsonData != null">#{jsonData,typeHandler=com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler}</if>
</trim>
</insert>
<select id="getDetailById" resultMap="BaseResultMap">
select *
from test
where is_deleted = 0
and id = #{id}
</select>
</mapper>