[Springboot/Mybatis]关于post/get传递包含多个对象/或数组/或数组里有对象的JSON参数插入/查询该如何处理的问题

本文介绍如何使用FastJSON将复杂的JSON数据结构转换为Java Bean,以便于MyBatis进行单表查询和插入操作。通过实例展示了如何在Service层解析JSON数据,并将其分解为多个Bean,再分别进行数据库操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

鉴于本人外键关联学得跟shi一样并且很讨厌写联表查和能力问题,我对每个数据都采用单表查询

当然这是建立在数据里真的很小的情况下

现在有一种情况就是我前端传来的JSON包含我需要的bean,和数组[],数组里也有bean...

这样传过来只能后端自己裁剪了,因为是数组,mybatis是不支持数组的,只能靠变通了,

目录

现在先说原理,

插入的时候

查询的时候


形如传值的是这样一组JSON

我的resume是一个bean,workExps是一个数组,数组里有bean

现在先说原理,

JSON实质上是一个map<string,obj>类型,而数组[{对象1},{对象2},....]是一个ArrList<map<string,obj>> 

知道原理不难进行转换,但是还是需要借助一个dependent,就是fastjson

所以添加依赖

 <!--把bean隐射为json-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.56</version>
        </dependency>

添加一个工具类用于转换controller里传来的requesbody的JSON,

package yiki.mybatis.util;

import com.alibaba.fastjson.JSON;

import java.util.Map;

public class JsonUtil {

 public static String obj2json(Object obj) throws Exception {
  return JSON.toJSONString(obj);
 }

 public static <T> T json2obj(String jsonStr, Class<T> clazz) throws Exception {
  return JSON.parseObject(jsonStr, clazz);
 }

 public static <T> Map<String, Object> json2map(String jsonStr)     throws Exception {
  return JSON.parseObject(jsonStr, Map.class);
 }

 public static <T> T map2obj(Map<?, ?> map, Class<T> clazz) throws Exception {
  return JSON.parseObject(JSON.toJSONString(map), clazz);
 }
}

插入的时候

接收器这样写(我嵌套了两层,这一层的实质是service,如果是controller也是一样的,只不过记得加reqbody注解

 public boolean AddResume(Map<String, Object> models) {


        try {
            Map<String, Object> resumeobj =
                    (Map<String, Object>) models.get("resume");
            ArrayList<Map<String, Object>> workExpList =
                    (ArrayList<Map<String, Object>>) models.get("workExps");
            Resume resume = JsonUtil.map2obj(resumeobj, Resume.class);

            Resume checkRept = resumeMapper.getResumeByuid(resume.getUid());

            if (checkRept != null) {
                return false;
            }

            resumeMapper.insertResume(resume);
            for (Map<String, Object> item : workExpList) {
                WorkExp workExp = JsonUtil.map2obj(item, WorkExp.class);
                workExpMapper.insertWorkExp(workExp);
            }
            return true;
        } catch (Exception e) {
            System.out.println(e);
        }
        return false;
    }

你可以看到我把JSON分解然后分别写入mapper,就是真的单表操作了- -,性能对于数据大其实不友好,但是也是个好参考

查询的时候

查出来的的多条数据组装成map


    <select id="getWorkExpByUid"
            parameterType="map"
            resultType="map">
        SELECT * FROM workExp WHERE uid= #{uid}
    </select>

service拼装同理而且不需要工具转换了,只需要交给springboot框架返回你json即可

 public Map<String, Object> getResume(Integer uid) {

        Map<String, Object> map = new HashMap<>();
        List<Map> wlist = workExpMapper.getWorkExpByUid(uid);

        Resume resume = resumeMapper.getResumeByuid(uid);

        map.put("workExps",wlist);
        map.put("resume",resume);

        return map;
    }

这样查出来是封装好的一个map

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值