文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

SpringBoot中如何处理MySQL中存储的JSON数据?

2023-09-03 09:12

关注

目录

一、MySQL中如何保存JSON类型的数据

1.1 建表

1.2 保存一条带json的记录

1.3 查询

二、Springboot操作当前数据库表

2.1 方式一(推荐)

2.2 方式二


JSON(JavaScript Object Notation)是一种轻量级的数据交换格式 。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。它易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。

1.1 建表

CREATE TABLE `steel` (  `id` int unsigned NOT NULL AUTO_INCREMENT,  `steel_grade` json NOT NULL COMMENT '钢种,json数组',  PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

1.2 保存一条带json的记录

INSERT INTO steel (steel_grade)VALUES ('["Q235", "PWB", "P610L"]');

1.3 查询

SELECT * FROM steel;

 

 当需要检索JSON类型字段中数据的某个具体值时,可以使用“->”和“->>”符号。

SELECT steel_grade -> '$[0]'FROM steel;SELECT steel_grade ->> '$[0]'FROM steel;

其中->>则是反序列化后的结果。

导入依赖这里就不赘述了,然后就是Application.yaml配置文件,这些都是和原来一样的。

我们通过代码生成器,自动生成实体类、controller、service、mapper这些基本结构。

话不多说,我们直接看关键的部分。

2.1 方式一(推荐)

实体类

@Data@TableName("steel")@ApiModel(value = "Steel对象", description = "")public class Steel implements Serializable {    private static final long serialVersionUID = 1L;    @TableId(value = "id",type = IdType.AUTO)    private Integer id;    @ApiModelProperty("钢种,json数组")    @TableField("steel_grade")    private String steelGrade;    }

我们可以用String类型去接收数据库的JSON类型。因为JSON就是以字符串的形式存储的嘛。 

controller

@Api(tags = "钢信息")@RestController@RequestMapping("/steel")public class SteelController {    @Resource    private SteelService steelService;    @ApiOperation("新增一条数据,测试保存json")    @PostMapping("save")    public Result save(String[] steelGrade){        steelService.saveData(steelGrade);        return Result.success();    }    @ApiOperation("查询数据")    @PostMapping("selectOne")    public Result selectSteelById(Integer id){        Steel steel = steelService.selectSteelById(id);        return Result.success(steel);    }}

 service

@Servicepublic class SteelServiceImpl extends ServiceImpl implements SteelService {    @Transactional    @Override    public void saveData(String... steelGrade) {        String jsonString = JSON.toJSONString(steelGrade);        Steel steel = new Steel();        steel.setSteelGrade(jsonString);        baseMapper.insert(steel);    }    @Override    public Steel selectSteelById(Integer id) {        Steel steel = baseMapper.selectById(id);        String steelGrade = steel.getSteelGrade();        List list = JSON.parseArray(steelGrade, String.class);        String str = "";        for (int i = 0; i < list.size(); i++) {            if (i == list.size() -1){                str += list.get(i);            }else {                str += list.get(i) + "、";            }        }        steel.setSteelGrade(str);        return steel;    }}

存数据的时候,我们要将集合转成JSON字符串,进行序列化,这样才方便后面解析。 

查询的时候,我们进行反序列化,由于存的是字符串类型的JSON数组,所有直接反序列化成数组即可。

测试保存

保存成功,数据增加了一条记录,对应的json数据格式正确。

 测试查询

 

查询成功。

值得注意的是,因为我们保存的是json格式的,那么获取的时候也一定要进行反序列化,解析成我们需要的格式即可。

2.2 方式二

使用MybatisPlus提供的字段类型处理器

具体的,实体类上按照如下设置即可。

@Data@Accessors(chain = true)@TableName(autoResultMap = true)public class User {    private Long id;    ...        @TableField(typeHandler = JacksonTypeHandler.class)    // @TableField(typeHandler = FastjsonTypeHandler.class)    private OtherInfo otherInfo;}

注解对应了 XML 中写法为

ok,我们在自己的项目中试验一下。

实体类

@Data@TableName(value = "steel",autoResultMap = true)@ApiModel(value = "Steel对象", description = "")public class Steel implements Serializable {    private static final long serialVersionUID = 1L;    @TableId(value = "id",type = IdType.AUTO)    private Integer id;    @ApiModelProperty("钢种,json数组")    @TableField(value = "steel_grade",typeHandler = FastjsonTypeHandler.class)    private List steelGrade;}

controller

controller不变

service

service层不需要我们自己再转成json,或者解析json了。通过实体类的注解参数就帮我们搞定了。

@Servicepublic class SteelServiceImpl extends ServiceImpl implements SteelService {    @Transactional    @Override    public void saveData(String... steelGrade) {        Steel steel = new Steel();        steel.setSteelGrade(Arrays.asList(steelGrade));        baseMapper.insert(steel);    }    @Override    public Steel selectSteelById(Integer id) {        Steel steel = baseMapper.selectById(id);        List steelGrade = steel.getSteelGrade();        steel.setSteelGrade(steelGrade);        return steel;    }}

测试保存

 测试查询

注意:查询出来的steelGrade集合的元素都带有双引号,说明返回的是JSON字符串格式,也意味着没有进行反序列化操作。我们还需要额外处理。

因此个人而言,我更倾向于方法一。

来源地址:https://blog.csdn.net/YuanFudao/article/details/130729611

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-数据库
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯