【Spring Boot】请求参数传json对象,后端采用(map)CRUD案例(101)

请求参数传json对象,后端采用(map)接收的前提条件:

1.Spring Boot 的Controller接受参数采用:@RequestBody
2.需要一个Json工具类,将json数据转成Map;

工具类:Json转Map


import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.commons.beanutils.PropertyUtils;
import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.*;

	/**
     * 。
     * (1) 使用泛型方法:把json字符串转换为相应的JavaBean对象;
     *     转换为普通JavaBean:readValue(json,Student.class);
     * (2) List Map转换List 对象:如List<Student>,将第二个参数传递为Student;
     * (3) List 对象转换List Map:
     *     [].class.然后使用Arrays.asList();方法把得到的数组转换为特定类型的List;
     *
     * @param jsonStr
     * @param valueType
     * @return
     * 
     */

public final class JsonUtils {

    private static ObjectMapper objectMapper;

    /**
     * (1) 使用泛型方法:把json字符串转换为相应的JavaBean对象;
     *     转换为普通JavaBean:readValue(json,Student.class);
     */
    public static <T> T readValue(String jsonStr, Class<T> valueType) throws Exception {
        if (objectMapper == null) {
            objectMapper = new ObjectMapper();
        }
        return objectMapper.readValue(jsonStr, valueType);
    }

    /**
     *(2).List Map转换List 对象:如List<Student>,将第二个参数传递为Student对象;
     *    map转换为bean
     */
    public static Object mapToObject(Map<String, String> map, Class<?> beanClass) throws Exception {
        if (map == null)
            return null;
        Object obj = beanClass.newInstance();
        BeanInfo beanInfo = Introspector.getBeanInfo(obj.getClass());
        PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
        for (PropertyDescriptor property : propertyDescriptors) {
            Method setter = property.getWriteMethod();
            if (setter != null) {
                setter.invoke(obj, map.get(property.getName()));
            }
        }
        return obj;
    }
	
	/**
	 *(3).List 对象转换List Map:
	 *    [].class.然后使用Arrays.asList();方法把得到的数组转换为特定类型的List;
     *    bean转换为map
     */
    public static <T> List<Map<String, Object>> listConvert(List<T> list){
        List<Map<String, Object>> list_map = new ArrayList<Map<String, Object>>();
        if (CollectionUtils.isNotEmpty(list)) {
            list.forEach(item ->{
                Map<String, Object> map = null;
                try {
                    map = PropertyUtils.describe(item);
                } catch (IllegalAccessException e) {
                    throw new RuntimeException(e);
                } catch (InvocationTargetException e) {
                    throw new RuntimeException(e);
                } catch (NoSuchMethodException e) {
                    throw new RuntimeException(e);
                }
                list_map.add(map);
            });
        }
        return list_map;
    }
}

Controller类:@RequestBody
备注:为了便于测试:Controller类只写了一个接口(实际开发可不要这样写噢)


	 *
     * 请求参数传递json数据:json对象(map)
     *
     */
    @PostMapping(value = "/addTest")
    @AuthInterceptor("mg:get:addTest")
    public Result addTest(@RequestBody String param) {
        try {
            Map<String, Object> paramMap = JsonUtils.readValue(param, Map.class);
            return xxxListService.addTest(paramMap);
        } catch (Exception e) {
            log.error("Controller addTest is error===:" + e.getMessage(), e);
            return Result.failure("测试成功");
        }
    }
    

Service类:

	Result addTest(Map<String, Object> paramMap);

ServiceImpl类:


	@Override
    public Result addTest(Map<String, Object> paramMap) {
        List<Map<String, Object>> res = new ArrayList<>();
        String interfaceType = String.valueOf(paramMap.get("interfaceType"));
        if(interfaceType.equals("add")){
            xxxListMapper.addTest(paramMap);
        }
        else if(interfaceType.equals("del")){
            xxxListMapper.delTest(paramMap);
        }
        else if(interfaceType.equals("modify")){
            xxxListMapper.modifyTest(paramMap);
        }
        else if(interfaceType.equals("sel")){
            res = xxxListMapper.selTest(paramMap);
        }
        return Result.success().result(res);
    }
    

Mapper类:


	//新增
    void addTest(Map<String, Object> paramMap);
    //删除
    void delTest(Map<String, Object> paramMap);
    //修改
    void modifyTest(Map<String, Object> paramMap);
    //查询
    List<Map<String, Object>> selTest(Map<String, Object> paramMap);
    

Mapper.xml类


	<!-- 新增 -->
    <insert id="addTest" parameterType="map">
        INSERT IGNORE INTO xxx_other_list_dic
        (dicNameFirst,dicValueFirst,dicNameSecond,dicValueSecond,dicType,isEnable)
        VALUES
        (#{dicNameFirst},#{dicValueFirst},#{dicNameSecond},#{dicValueSecond},#{dicType},#{isEnable})
    </insert>
    <!-- 删除 -->
    <select id="delTest" parameterType="map">
        delete
        FROM xxx_other_list_dic where
        <if test = "null != seqId and '' != seqId">
            seqId = #{seqId}
        </if>
    </select>
    <!-- 修改 -->
    <update id="modifyTest" parameterType="map">
        update xxx_other_list_dic
        <set>
            <if test = "null != sortId and '' != sortId">
                sortId = #{sortId},
            </if>
            <if test = "null != isEnable and '' != isEnable">
                isEnable = #{isEnable}
            </if>
        </set>
        where
        <if test = "null != seqId and '' != seqId">
            seqId = #{seqId}
        </if>
    </update>
    <!-- 查询 -->
    <select id="selTest" parameterType="map" resultType="map">
        SELECT *
        FROM xxx_other_list_dic where 1 = 1
        <if test="null != dicNameFirst and '' != dicNameFirst">
            and dicNameFirst = #{dicNameFirst}
        </if>
        <if test="null != dicValueFirst and '' != dicValueFirst">
            and dicValueFirst = #{dicValueFirst}
        </if>
        <if test="null != dicNameSecond and '' != dicNameSecond">
            and dicNameSecond = #{dicNameSecond}
        </if>
        <if test="null != dicValueSecond and '' != dicValueSecond">
            and dicValueSecond = #{dicValueSecond}
        </if>
        <if test="null != dicType and '' != dicType">
            and dicType = #{dicType}
        </if>
        <if test="null != isEnable and '' != isEnable">
            and isEnable = #{isEnable}
        </if>
        order by sortId
    </select>
    

Postman 接口测试:
新增:
在这里插入图片描述
在这里插入图片描述
修改:
在这里插入图片描述
在这里插入图片描述
查询:
在这里插入图片描述
删除:
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/57949.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux部署jar包,隐藏命令行参数

Linux部署jar包&#xff0c;隐藏命令行参数 一、背景需求二、查阅资料三、实现隐藏库3.1、测试test.c3.2、设置隐藏库3.3、验证 四、应用jar启动命令五、直接应用结果 最新项目安全检测&#xff0c;发现配置文件中数据库密码&#xff0c;redis密码仍处理明文状态 于是整理了一篇…

linux快速安装tomcat

linux快速安装tomcat 前提安装好jdk 下载Tomcat安装包 wget https://dlcdn.apache.org/tomcat/tomcat-10/v10.0.27/bin/apache-tomcat-10.0.27.tar.gz如果出现颁发的证书已经过期的错误提示,用下面命令 wget --no-check-certificate https://dlcdn.apache.org/tomcat/tomcat-1…

链表的总体涵盖以及无哨兵位单链表实现——【数据结构】

&#x1f60a;W…Y&#xff1a;个人主页 在学习之前看一下美丽的夕阳&#xff0c;也是很不错的。 如果觉得博主的美景不错&#xff0c;博客也不错的话&#xff0c;关注一下博主吧&#x1f495; 在上一期中&#xff0c;我们说完了顺序表&#xff0c;并且提出顺序表中的问题 1. 中…

AWS——02篇(AWS之服务存储EFS在Amazon EC2上的挂载——针对EC2进行托管文件存储)

AWS——02篇&#xff08;AWS之服务存储EFS在Amazon EC2上的挂载——针对EC2进行托管文件存储&#xff09; 1. 前言2. 关于Amazon EFS2.1 Amazon EFS全称2.2 什么是Amazon EFS2.3 优点和功能2.4 参考官网 3. 创建文件系统3.1 创建 EC2 实例3.2 创建文件系统 4. 在Linux实例上挂载…

Pytorch深度学习-----神经网络之Sequential的详细使用及实战详解

系列文章目录 PyTorch深度学习——Anaconda和PyTorch安装 Pytorch深度学习-----数据模块Dataset类 Pytorch深度学习------TensorBoard的使用 Pytorch深度学习------Torchvision中Transforms的使用&#xff08;ToTensor&#xff0c;Normalize&#xff0c;Resize &#xff0c;Co…

Sui主网升级至V1.6.3版本

Sui主网现已升级至V1.6.3版本&#xff0c;此升级包含了多项修复和优化。升级要点如下所示&#xff1a; #13029 在构建Move代码时&#xff0c;可能会出现与实现自定义transfer/share/freeze函数相关的额外linter警告。这些函数是为了实施自定义的transfer/share/freeze策略而…

Vue3 基础知识点汇总 自学笔记,记录难点 和 新知识点

1.vue3 基础 1.1vue3基础及创建 npm init vue@latest1.2.熟悉项目目录及关键文字 1.3 组合式API-setup 1.4.组合式 API reactive 和ref 函数 (都是为了生成响应式数据) 1.5.组合式API-computed 计算属性函数 1.6.watch 函数 1.7.组合式API-生命周期函数 1.8.组合式 API-父子…

记录 Vue3 + Ts 类型使用

阅读时长: 10 分钟 本文内容&#xff1a;记录在 Vue3 中使用 ts 时的各种写法. 类型大小写 vue3 ts 项目中&#xff0c;类型一会儿大写一会儿小写。 怎么区分与基础类型使用? String、string、Number、number、Boolean、boolean … 在 js 中&#xff0c; 以 string 与 String…

【多线程初阶】多线程案例之单例模式

文章目录 前言1. 什么是单例模式2. 饿汉模式3. 懒汉模式 --- 单线程版4. 懒汉模式 --- 多线程版5. 懒汉模式 --- 多线程改进版总结 前言 本文主要给大家讲解多线程的一个重要案例 — 单例模式. 关注收藏, 开始学习吧&#x1f9d0; 1. 什么是单例模式 单例模式是一种很经典的…

Prometheus-各种exporter

一、 nginx-prometheus-exporter 1 nginx 配置 1.1 Nginx 模块支持 nginx 安装的时候需要有 nginx 的状态模块: stub_status 可通过如下命令检查 nginx -V 2>&1 | grep -o with-http_stub_status_module1.2 Nginx 配置文件配置 添加如下配置到自己 nginx 的配置文…

落地数字化管理,提升企业市场竞争力

数字化企业管理方案是一种利用数字技术和信息系统来提升企业管理效率和运营效果的策略。 潜在的数字化企业管理方案 1、企业资源规划&#xff08;ERP&#xff09;系统&#xff1a;建立一个集成的ERP系统来统一管理企业的各项业务流程&#xff0c;包括采购、销售、库存管理、财…

Java超级玛丽小游戏制作过程讲解 第一天 创建窗口

package com.sxt;import javax.swing.*; import java.awt.event.KeyEvent; import java.awt.event.KeyListener;public class MyFrame extends JFrame implements KeyListener {//设置窗口的大小为800*600public MyFrame() {this.setSize(800, 600);//设置窗口中显示this.setLo…

Cpp9 — map和set

map和set STL分为序列式容器&#xff08;vector、list、deque&#xff09;和关联式容器&#xff08;map、set&#xff09; 序列式容器&#xff1a;数据与数据之间没有很强的联系。&#xff08;各个数据之间没什么关联&#xff09;。底层为线性序列的数据结构&#xff0c;里面…

【云原生K8s】二进制部署单master K8s+etcd集群

一、实验设计 mater节点master01192.168.190.10kube-apiserver kube-controller-manager kube-scheduler etcd node节点node01192.168.190.20kubelet kube-proxy docker (容…

elementUI全屏loading的使用(白屏的解决方案)

官网中有使用方法&#xff0c;但是我实际上手之后会出现白屏&#xff0c;解决办法如下&#xff1a; <el-button type"text" size"small" click"delRow(scope)"> 删除</el-button>loading: false, // loading 动画loadingInstance…

ubuntu下,在vscode中使用platformio出现 Can not find working Python 3.6+ Interpreter的问题

有一段时间没有使用platformio了&#xff0c;今天突然使用的时候&#xff0c;发现用不了&#xff0c;报错&#xff1a; Ubuntu PlatformIO: Can not find working Python 3.6 Interpreter. Please install the latest Python 3 and restart VSCode。 上网一查&#xff0c;发现…

【NLP概念源和流】 06-编码器-解码器模型(6/20 部分)

一、说明 在机器翻译等任务中,我们必须从一系列输入词映射到一系列输出词。读者必须注意,这与“序列标记”不同,在“序列标记”中,该任务是将序列中的每个单词映射到预定义的类,如词性或命名实体任务。 作者生成 在上面的

基于回溯算法实现八皇后问题

八皇后问题是一个经典的计算机科学问题&#xff0c;它的目标是将8个皇后放置在一个大小为88的棋盘上&#xff0c;使得每个皇后都不会攻击到其他的皇后。皇后可以攻击同一行、同一列和同一对角线上的棋子。 一、八皇后问题介绍 八皇后问题最早由国际西洋棋大师马克斯贝瑟尔在18…

计算机视觉与图形学-神经渲染专题-第一个基于NeRF的自动驾驶仿真平台

如今&#xff0c;自动驾驶汽车可以在普通情况下平稳行驶&#xff0c;人们普遍认识到&#xff0c;真实的传感器模拟将在通过模拟解决剩余的极端情况方面发挥关键作用。为此&#xff0c;我们提出了一种基于神经辐射场&#xff08;NeRF&#xff09;的自动驾驶模拟器。与现有作品相…

7_分类算法—逻辑回归

文章目录 逻辑回归&#xff1a;1 Logistic回归&#xff08;二分类问题&#xff09;1.1 sigmoid函数1.2 Logistic回归及似然函数&#xff08;求解&#xff09;1.3 θ参数求解1.4 Logistic回归损失函数1.5 LogisticRegression总结 2 Softmax回归&#xff08;多分类问题&#xff0…