教你用反射机制如何几分钟搭建完后端

news2025/7/19 5:16:37

如果想快速搭建后台跨域使用这些技术

  1. 反射
  2. mybatis-plus
  3. json

反射可以实现动态数据的传输
一般对数据库进行操作肯定离不开这些代码
在这里插入图片描述
如果我们用反射机制只需要这一个就行
在这里插入图片描述
而说到反射的好处,一般情况下我们做增删改查需要大量的接口才能完成,而用反射我们需要一个接口就能完成,如果觉得代码臃肿可以进行细分为四个接口分别是增删改查四个接口。
这是数据库的数据

数据库信息

在这里插入图片描述
在这里插入图片描述

查询Student数据

现在我要查询Studnet里第一条数据,我可以用json传给后台的数据如下
在这里插入图片描述

	{"class":"Student","type":"getOne","data":{"Sno":060101}}

查询结果
在这里插入图片描述

查询Couser数据

再比如我要查询Couser的第一条数据,我可以传入如下的json数据

在这里插入图片描述

{"class":"Course","type":"getOne","data":{"Cno":"C01"}}

查询结果
在这里插入图片描述

查询所有数据

要是查询Student的list数据可以输入这个json
在这里插入图片描述

{"class":"Student","type":"list"}

查询结果
在这里插入图片描述

加入条件查询所有数据

要是想分页并且查询的数男生可以输入这个json
在这里插入图片描述

{"class":"Student","type":"list","data":{"Sno":060101,"Sname":"钟文辉","Ssex":"男"},"condition":{"page":"1,2"}}

查询结果
在这里插入图片描述
或者查询第二页
在这里插入图片描述
在这里插入图片描述

模糊查询

如果你想要模糊查询可以输入这个json
在这里插入图片描述

{"class":"Student","type":"like","condition":{"like":"Sname:文"}}

查询结果
在这里插入图片描述

模糊查询并加入查询条件

要输想在模糊查询中查询男生可以输入这个json
在这里插入图片描述

{"class":"Student","type":"like","data":{"Ssex":"男"},"condition":{"like":"Sname:文"}}

查询结果
在这里插入图片描述

向Student表插入数据

如果想Student表里插入数据可以这样
在这里插入图片描述

[{"key":"data","value":"{\"class\":\"Student\",\"type\":\"save\",\"data\":{\"Sno\":06010123,\"Sname\":\"樱木花道\",\"Ssex\":\"男\"}}","description":"","type":"default","enabled":true}]

在这里插入图片描述

向Course表插入数据

如果想Course表里插入数据可以这样
在这里插入图片描述

{"class":"Course","type":"save","data":{"Cno":"C123","Cname":"数学"}}

结果如下
在这里插入图片描述

修改数据

如果想修改Student中新加的数据
在这里插入图片描述


{"class":"Student","type":"update","data":{"Sno":"6010123","Sname":"三井寿"}}

在这里插入图片描述

删除数据

如果要删除Student表的数据
在这里插入图片描述

[{"key":"data","value":"{\"class\":\"Student\",\"type\":\"remove\",\"data\":{\"removeId\":\"6010123\"}}","description":"","type":"default","enabled":true}]

结果
在这里插入图片描述

结论

这些所有的数据操作都是来自这个接口,无需写其他接口即可完成一系列的数据库操作。如果想快速完成一个网站可以使用反射+mybatis-plus+json来完成。
在这里插入图片描述

代码

我现在只完成了一部分的数据库操作,后面会进行完善,到时候搭建后台只需要复制到项目就可以了,附上一部分核心的代码

import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.example.adminproject.entity.Student;
import com.example.adminproject.service.CourseService;
import com.example.adminproject.service.ScService;
import com.example.adminproject.service.StudentService;
import com.example.adminproject.utils.ClassNameUtil;
import com.example.adminproject.utils.Condition;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.PostMapping;

import org.springframework.web.bind.annotation.RestController;
import sun.reflect.misc.ReflectUtil;

import java.io.Serializable;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.HashMap;

/**
 * <p>
 *  前端控制器
 * </p>
 *
 * @author Talisman
 * @since 2023-02-22
 */
@RestController
@Component
public class StudentController {


    @Autowired
    private StudentService service;

    @Autowired
    private CourseService courseService;

    @Autowired
    private ScService scService;

    @Autowired
    private ApplicationContext applicationContext;

    public static HashMap<String,Class>serviceClassMap = new HashMap<>();
    public static HashMap<String,Class>entityClassMap = new HashMap<>();

    @PostMapping("/getData")
    public Object getData(String data) throws Exception {

        JSONObject jsonObject = JSONObject.parseObject(data);
        JSONObject returnData = JSONObject.parseObject(String.valueOf(jsonObject.get("data")));
        JSONObject conditionData = JSONObject.parseObject(String.valueOf(jsonObject.get("condition")));
        Class cls = serviceClassMap.get(jsonObject.get("class"));
        Object obj = applicationContext.getBean(cls);

        // {"type":"getOne"}
        if (jsonObject.get("type").equals("getOne")){
            QueryWrapper queryWrapper = new QueryWrapper<>();
            for (String s : returnData.keySet()) {
                queryWrapper.eq(s,returnData.get(s));
            }
            Method getOne = cls.getMethod("getOne", Wrapper.class);
            getOne.setAccessible(true);
            getOne.invoke(obj,queryWrapper);
            return cls.getMethod("getOne",Wrapper.class).invoke(obj,queryWrapper);
        }

        else if (jsonObject.get("type").equals("list")){  // 获取全部集合
            // 有判断条件  {"type":"list","data":{"Sname":"钟文辉","Ssex":"男"}}
            QueryWrapper queryWrapper = new QueryWrapper<>();
            if (jsonObject.containsKey("data")){
//                QueryWrapper queryWrapper = new QueryWrapper<>();
                for (String s : returnData.keySet()) {
                    queryWrapper.eq(s,returnData.get(s));
                }
                // 有条件 例如分页 limit
                // {"type":"list","data":{,"Ssex":"男"},"condition":{"page":"1,3"}}
                if (jsonObject.containsKey("condition")){
                    return Condition.isConditionData(conditionData,cls,obj,queryWrapper);
                }
                // 没有条件 {"type":"list","data":{"Sname":"钟文辉","Ssex":"男"}}
                return service.list(queryWrapper);
            }
            // 没有判断条件 但有条件  {"type":"list","condition":{"page":"1,3"}}
            if (jsonObject.containsKey("condition")){
                return Condition.isConditionData(conditionData,cls,obj,queryWrapper);
            }
            //  {"type":"list"}
            return service.list(null);
        }

        //  {"type":"like"}
        else if (jsonObject.get("type").equals("like")){
            QueryWrapper<Student> queryWrapper = new QueryWrapper<>();
            // {"type":"like","data":{"Sno":060101,"Sname":"钟文辉"}}
            if (jsonObject.containsKey("data")){
                for (String s : returnData.keySet()) {
                    queryWrapper.eq(s,returnData.get(s));
                }
            }
            // {"type":"like","data":{"Ssex":"男"},"condition":{"like":"Sname:嘉"}}
            if (jsonObject.containsKey("condition")){
                return Condition.isConditionData(conditionData,cls,obj,queryWrapper);
            }
        }

        else if (jsonObject.get("type").equals("count")){ // 获取数量

            return service.count();
        }else if (jsonObject.get("type").equals("save")){  // 插入数据
            Method getOne = cls.getMethod("save", Object.class);
            getOne.setAccessible(true);
            getOne.invoke(obj,returnData.toJavaObject(entityClassMap.get(jsonObject.get("class"))));
        }else if (jsonObject.get("type").equals("update")){ //更新数据
            Method getOne = cls.getMethod("updateById", Object.class);
            getOne.setAccessible(true);
            getOne.invoke(obj,returnData.toJavaObject(entityClassMap.get(jsonObject.get("class"))));
        }else if (jsonObject.get("type").equals("remove")){  //删除数据
            Method getOne = cls.getMethod("removeById", Serializable.class);
            getOne.setAccessible(true);
            getOne.invoke(obj,returnData.get("removeId"));
        }
        return null;
    }
import java.net.URL;
import java.util.ArrayList;
import java.util.Enumeration;

import java.io.File;

import java.io.File;
import java.net.URL;
import java.util.Enumeration;
import java.util.List;

/**
 * @author lingkang
 * @date 2021/12/3
 */
public class ClassUtils {
    // getClassName("com.example.adminproject.entity")
    public static List getClassByPackage(String packageName) {
        try {
            Enumeration<URL> resources = ClassUtils.class.getClassLoader().getResources(packageName.replaceAll("\\.", "/"));
            while (resources.hasMoreElements()) {
                URL url = resources.nextElement();
                String[] file = new File(url.getFile()).list();
                ArrayList<String> list = new ArrayList<>();
                for (int i = 0; i < file.length; i++) {
                    if (file[i].indexOf(".class")!=-1){
                        list.add(file[i].replaceAll("\\.class", ""));
                    }
                }
                return list;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023如果纯做业务测试的话,在测试行业有出路吗?

直接抛出我的结论&#xff1a;手工做业务类测试&#xff0c;没有前途。 个人建议赶紧从业务测试跳出来&#xff0c;立即学习代码&#xff0c;走自动化测试方向。目前趋势&#xff0c;业务测试需要用自动化做。 为了让大家能够信服我的观点&#xff0c;本文将从以下方面进行阐…

LeetCode题目笔记——2357. 使数组中所有元素都等于零

文章目录题目描述题目链接题目难度——简单方法一&#xff1a;直接模拟代码/Python方法二&#xff1a;哈希表代码/Python总结题目描述 给你一个非负整数数组 nums 。在一步操作中&#xff0c;你必须&#xff1a; 选出一个正整数 x &#xff0c;x 需要小于或等于 nums 中 最小…

嵌入式系统硬件设计与实践(学习方法)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 刚读书的时候&#xff0c;对什么是嵌入式&#xff0c;其实并不太清楚。等到自己知道的时候&#xff0c;已经毕业很多年了。另外对于计算机毕业的学…

RK3588关键电路 PCB Layout设计指南

1、音频接口电路 PCB 设计&#xff08;1&#xff09;所有 CLK 信号建议串接 22ohm 电阻&#xff0c;并靠近 RK3588 放置&#xff0c;提高信号质量&#xff1b;&#xff08;2&#xff09;所有 CLK 信号走线不得挨在一起&#xff0c;避免串扰&#xff1b;需要独立包地&#xff0c…

jianzhiOffer第二版难重点记录

04. 二维数组中的查找https://leetcode.cn/problems/er-wei-shu-zu-zhong-de-cha-zhao-lcof/ 思路&#xff1a;可以每层用以恶搞二分查找&#xff0c;优化思路&#xff1a;从左下角出发直接用二分。 ​​​​​​07. 重建二叉树https://leetcode.cn/problems/zhong-jian-er-cha…

Redis 常用数据类型之 zset

目录 一、zset数据结构 二、Redis的zset 三、详细操作 基础操作&#xff08;zadd、zcrad、zcount&#xff09; 排序操作&#xff08;zrange 、zrevrange &#xff09; 根据分数显示元素&#xff08;zrangebyscore&#xff09; 删除操作&#xff08;zrem、zremrangebyran…

DSPE-PEG-TCO;磷脂-聚乙二醇-反式环辛烯科研用化学试剂简介

中文名称 磷脂-聚乙二醇-反式环辛烯 英文名称 DSPE-PEG-TCO 外观&#xff1a;粉末或半固体&#xff0c;取决于分子量。 溶剂&#xff1a;溶于大部分有机溶剂&#xff0c;如&#xff1a;DCM、DMF、DMSO、THF等等。在水中有很好的溶解性 稳定性&#xff1a;冷藏保存&#xff…

安装包UI美化之路-通过nsNiuniuSkin来做Electron程序的打包、发布与升级

nsNiuniuSkin从发布之初&#xff0c;因其简单、简洁、高效&#xff0c;受到了非常多公司的青睐&#xff0c;现在已经越来越多的公司采用我们的这套解决方案来制作安装包了&#xff01; 从一个安装包UI插件&#xff0c;逐步演化成一套集美观、安全、简洁、自动化为一体的完整的…

ModBus RTU与ModBus TCP通信协议详解

1、Modbus简介 Modbus通信协议由Modicon公司&#xff08;现已经为施耐德公司并购&#xff0c;成为其旗下的子品牌&#xff09;于1979年发明的&#xff0c;是全球最早用于工业现场的总线规约。由于其免费公开发行&#xff0c;该协议免费使用&#xff0c;Modbus通信协议采用的是主…

电力电子技术复习笔记

绪论电力电子器件直流-直流直流直流动态模型整流电路逆变电路&#xff1a;有源逆变软开关电路期末绪论 电力电子技术&#xff1a;使用电力电子器件对电能进行转换和控制的技术 电力电子技术和信息电子技术的本质区别&#xff1a; 电力电子技术主要用于电能变换 信息电子技术…

2023什么蓝牙耳机好用不贵?适合学生党的国产蓝牙耳机推荐

蓝牙耳机因为摆脱了线的束缚&#xff0c;在日常生活中解放了双手&#xff0c;使用更便捷。现如今的蓝牙耳机越来越多&#xff0c;每款耳机都有自己的侧重。下面&#xff0c;我来给大家推荐几款好用不贵发国产蓝牙耳机&#xff0c;一起来看看吧。 一、南卡小音舱蓝牙耳机 参考…

Linux操作系统基础知识命令参数详解

Linux操作系统 RAID分组 RAID JBOD RAID JBOD的意思是Just a Bunch Of Disks&#xff0c;是将多块硬盘串联起来组成一个大的存储设备&#xff0c;从某种意义上说这种类型不被算作RAID&#xff0c;在维基百科里JBOD同时也被归入非RAID架构。RAID JBOD将所有的磁盘串联成一个单…

【聚类指标】如何评估聚类算法:外部指标和内部指标、指标详解

【聚类指标】如何评估聚类算法&#xff1a;外部指标和内部指标、指标详解 文章目录【聚类指标】如何评估聚类算法&#xff1a;外部指标和内部指标、指标详解1. 前言2. 外部指标2.1 P&#xff08;Purity&#xff09;2.1.1 例子2.2 NMI&#xff08;Normalized Mutual Information…

PHP基础(1)

PHP基础PHP简介解析器最简单的PHP文件传值与传址输出函数数据类型数据类型比较单双引号的区别字符串及常用函数PHP简介 PHP是最常用的动态web开发语言&#xff0c;用于开发动态网站。常见的动态web开发语言还有: asp aspx.jsp(javaweb)。PHP可以嵌入到html中执行&#xff0c;使…

webpack打包ts代码

webpack整合 通常情况下&#xff0c;实际开发中我们都需要使用构建工具对代码进行打包&#xff1b; TS同样也可以结合构建工具一起使用&#xff0c;下边以webpack为例介绍一下如何结合构建工具使用TS&#xff1b; 步骤如下&#xff1a; (1)初始化项目 进入项目根目录&…

IDE 文档注释使用,模板注释,ide配置templates

文档注释基于javadoc模板 类注释 /*** 暂无介绍** author admin* version 1.0.0* <dt><span class"simpleTagLabel">时间:</span></dt>* <dd>2023/2/24</dd>*/方法注释 /*** 暂无描述** author admin* param args */javadoc相…

PowerShell Install Redis

Redis 前言 Redis&#xff08;Remote Dictionary Server )&#xff0c;即远程字典服务&#xff0c;是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库&#xff0c;并提供多种语言的API。 Redis dowload Redis WindowsdownloadRedi…

字节在职5年,一个测试工程师的坎坷之路

几年前进入到IT行业&#xff0c;现在发现学习软件测试的人越来越多&#xff0c;今天我想根据自己的行业经验给大家提一些建议。 跟其他行业相比&#xff0c;做软件测试的岗位确实算是高薪职业&#xff0c;我们那个时候起步的工资并不高&#xff0c;而看现在很多毕业的学生薪资都…

Scala-面向对象引入(包、类和对象)

包 包对象 导包 类和对象 方法和构造器 包 Scala 包的三大作用&#xff08;和 Java 一样&#xff09;&#xff1a; 区分相同名字的类当类很多时&#xff0c;可以很好的管理类控制访问范围 基本语法 package 包名 Scala 有两种包的管理风格&#xff0c;一种方式和 Java …

Transformer模型

图1图2第一张图transfomer模型图&#xff0c;第二张图是是以各个功能模块的形式来呈现transformer的。 在这里我们来讲transformer的几个关键技术: 1.encoder部分的位置嵌入 2.encoder部分的多头注意力机制 3.残差连接 4.LayerNormalization 5.decoder部分的多头注意力的…