教你用反射机制如何几分钟搭建完后端
迪丽瓦拉
2025-05-28 12:27:06
0

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

  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来完成。
在这里插入图片描述

代码

直接复制代码就能使用了
在这里插入图片描述

ReflexController

import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.springframework.context.ApplicationContext;import java.io.Serializable;
import java.lang.reflect.Method;public class ReflexController {public static Object Controller(ApplicationContext applicationContext,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 = ClassNameUtil.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);return getOne.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":"男"}}Method list = cls.getMethod("list", Wrapper.class);list.setAccessible(true);return list.invoke(obj,queryWrapper);}// 没有判断条件 但有条件  {"type":"list","condition":{"page":"1,3"}}if (jsonObject.containsKey("condition")){return Condition.isConditionData(conditionData,cls,obj,queryWrapper);}//  {"type":"list"}Method list = cls.getMethod("list",Wrapper.class);list.setAccessible(true);return list.invoke(obj,queryWrapper);}//  {"type":"like"}else if (jsonObject.get("type").equals("like")){QueryWrapper 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")){ // 获取数量// {"class":"Student","type":"count","data":{"Ssex":"男"}}QueryWrapper queryWrapper = new QueryWrapper();if (jsonObject.containsKey("data")){for (String s : returnData.keySet()) {queryWrapper.eq(s,returnData.get(s));}}Method count = cls.getMethod("count",Wrapper.class);count.setAccessible(true);return count.invoke(obj,queryWrapper);}else if (jsonObject.get("type").equals("save")){  // 插入数据Method getOne = cls.getMethod("save", Object.class);getOne.setAccessible(true);getOne.invoke(obj,returnData.toJavaObject(ClassNameUtil.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(ClassNameUtil.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;}
}

Condition

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.baomidou.mybatisplus.extension.plugins.pagination.Page;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;public class Condition {// 有data查询数据库的条件并且condition是分页   例如 select * from student where Sname = "廖嘉乐" limit 1,3public static Object isConditionData(JSONObject conditionData,Class cls,Object obj, QueryWrapper queryWrapper)throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {if (conditionData.containsKey("page")){String p = (String) conditionData.get("page");Page page = new Page<>(Integer.parseInt(p.split(",")[0]),Integer.parseInt(p.split(",")[1]));Method method = cls.getMethod("page", IPage.class,Wrapper.class);method.setAccessible(true);if (conditionData.containsKey("like")||conditionData.containsKey("llike")||conditionData.containsKey("rlike")){method.invoke(obj,page,dimQuery(conditionData,queryWrapper));}return method.invoke(obj,page,queryWrapper);}//{"type":"like","data":{"Ssex":"男"},"condition":{"like":"Sname:嘉"}}Method method = cls.getMethod("list", Wrapper.class);method.setAccessible(true);return method.invoke(obj,dimQuery(conditionData,queryWrapper));}public static QueryWrapper dimQuery(JSONObject conditionData, QueryWrapper queryWrapper){if (conditionData.containsKey("like")){// 例子 {like:"Sname:嘉"}   %嘉%String[] split = String.valueOf(conditionData.get("like")).split(":");queryWrapper.like(split[0],split[1]);return queryWrapper;}else if (conditionData.containsKey("llike")){ // 例如 Sname like %嘉String[] split = String.valueOf(conditionData.get("llike")).split(":");queryWrapper.likeLeft(split[0],split[1]);return queryWrapper;}else if (conditionData.containsKey("rlike")) { // 例如 Sname like 嘉%String[] split = String.valueOf(conditionData.get("rlike")).split(":");queryWrapper.likeRight(split[0], split[1]);return queryWrapper;}return null;}}

ClassNameUtil

import java.io.File;
import java.net.URL;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;@Component
@ConfigurationProperties(prefix = "reflex")
public class ClassNameUtil {public static HashMap serviceClassMap = new HashMap<>();public static HashMapentityClassMap = new HashMap<>();public static String serviceClass = "com.example.adminproject.service";public static String entityClass = "com.example.adminproject.entity";public String getServiceClass() {return serviceClass;}public String getEntityClass() {return entityClass;}public static Class serviceName(String serviceClass,String className) throws ClassNotFoundException {return Class.forName(serviceClass + "."+ className + "Service");}public static Class entityName(String entityClass,String className) throws ClassNotFoundException {return Class.forName(entityClass + "." + className);}public static List getClassByPackage(String packageName) {try {Enumeration resources = ClassNameUtil.class.getClassLoader().getResources(packageName.replaceAll("\\.", "/"));while (resources.hasMoreElements()) {URL url = resources.nextElement();String[] file = new File(url.getFile()).list();ArrayList 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;}
}

MapCommandRunner

import com.example.adminproject.utils.ClassNameUtil;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;import java.util.List;@Component
public class MapCommandRunner implements CommandLineRunner {@Overridepublic void run(String... args) throws Exception {// 存储反射提高性能// 存储service和entityList serviceClassByPackage = ClassNameUtil.getClassByPackage(ClassNameUtil.serviceClass);List entityClassByPackage = ClassNameUtil.getClassByPackage(ClassNameUtil.entityClass);for (int i = 0; i < serviceClassByPackage.size(); i++) {String service = String.valueOf(serviceClassByPackage.get(i)).replaceAll("Service", "");ClassNameUtil.serviceClassMap.put(service, ClassNameUtil.serviceName(ClassNameUtil.serviceClass, service));}for (int i = 0; i < entityClassByPackage.size(); i++) {String entity = String.valueOf(entityClassByPackage.get(i));ClassNameUtil.entityClassMap.put(entity, ClassNameUtil.entityName(ClassNameUtil.entityClass,entity));}}
}

controller

	@Autowiredprivate ApplicationContext applicationContext;@PostMapping("/getData")public Object getData(String data) throws Exception {return ReflexController.Controller(applicationContext,data);}

相关内容

热门资讯

linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
C++ 机房预约系统(六):学... 8、 学生模块 8.1 学生子菜单、登录和注销 实现步骤: 在Student.cpp的...
A.机器学习入门算法(三):基... 机器学习算法(三):K近邻(k-nearest neigh...
数字温湿度传感器DHT11模块... 模块实例https://blog.csdn.net/qq_38393591/article/deta...
有限元三角形单元的等效节点力 文章目录前言一、重新复习一下有限元三角形单元的理论1、三角形单元的形函数(Nÿ...
Redis 所有支持的数据结构... Redis 是一种开源的基于键值对存储的 NoSQL 数据库,支持多种数据结构。以下是...
win下pytorch安装—c... 安装目录一、cuda安装1.1、cuda版本选择1.2、下载安装二、cudnn安装三、pytorch...
MySQL基础-多表查询 文章目录MySQL基础-多表查询一、案例及引入1、基础概念2、笛卡尔积的理解二、多表查询的分类1、等...
keil调试专题篇 调试的前提是需要连接调试器比如STLINK。 然后点击菜单或者快捷图标均可进入调试模式。 如果前面...
MATLAB | 全网最详细网... 一篇超超超长,超超超全面网络图绘制教程,本篇基本能讲清楚所有绘制要点&#...
IHome主页 - 让你的浏览... 随着互联网的发展,人们越来越离不开浏览器了。每天上班、学习、娱乐,浏览器...
TCP 协议 一、TCP 协议概念 TCP即传输控制协议(Transmission Control ...
营业执照的经营范围有哪些 营业执照的经营范围有哪些 经营范围是指企业可以从事的生产经营与服务项目,是进行公司注册...
C++ 可变体(variant... 一、可变体(variant) 基础用法 Union的问题: 无法知道当前使用的类型是什...
血压计语音芯片,电子医疗设备声... 语音电子血压计是带有语音提示功能的电子血压计,测量前至测量结果全程语音播报࿰...
MySQL OCP888题解0... 文章目录1、原题1.1、英文原题1.2、答案2、题目解析2.1、题干解析2.2、选项解析3、知识点3...
【2023-Pytorch-检... (肆十二想说的一些话)Yolo这个系列我们已经更新了大概一年的时间,现在基本的流程也走走通了,包含数...
实战项目:保险行业用户分类 这里写目录标题1、项目介绍1.1 行业背景1.2 数据介绍2、代码实现导入数据探索数据处理列标签名异...
记录--我在前端干工地(thr... 这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前段时间接触了Th...
43 openEuler搭建A... 文章目录43 openEuler搭建Apache服务器-配置文件说明和管理模块43.1 配置文件说明...