教你用反射机制如何几分钟搭建完后端
创始人
2025-05-28 10:13:33

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

  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);}

相关内容

热门资讯

【Java闭关修炼】Sprin... # 配置Mysql与注册登录模块应用服务模型IDEA 连接数据库点击IDEA右侧的database ...
Oracle 常见报错问题汇总 Oracle 常见报错问题汇总 报错:ORA-01017: invalid username/pas...
计算不规则区域的周长和面积——... 1.题目描述 设计求不规则区域周长和面积计算的算法。 测试数据的获得: 输入样例&#x...
STM32之IIC IIC协议IIC全称Inter-Integrated Circuit (集成电路总线),...
Vue3 使用MD5加密(清晰... 概述 最近在想做个cloud项目,gitee上找了个模板项目,前端使用到vue3 &#...
使用Idea编译Nacos源码... 其实nacos下载下来启动就可以了,但是为了方便一些,而且Nacos在GitHub上下载是真的慢,可...
【abp Vnext】下载并运... 软件环境:电脑需要基础软件环境node.js、npm,这些网上教程很多&...
一文了解|氢燃料电池行业痛点问... 早在1839年的英国,一位名叫威廉格罗夫的科学家,就已发明了一款通过氢气...
华秋工艺分享:第八道主流程之丝... 如图,第八道主流程为 文字 。 文字的目的:文字又名字符。是线路板上白色...
Redis10大数据类型 Redis10大数据类型Redis键(key)一、Redis字符串&#x...
MySQL变量的使用 文章目录1、系统变量1.1 查看系统变量1.2 设置系统变量2、用户变量2.1 定义用户变量2.2 ...
IntelliJ IDEA创建... 目录 ——————————————————————————————— 一、创建Java项目 1、创建...
Qt学习_08_用独立的文件存... 0 前言 上一篇笔记对样式表进行了初步学习,QT学习_07_样式表的初步学习_江湖上都...
小黑子—多媒体技术与运用基础知... 多媒体技术与运用1.0多媒体系列第一章1. 计算机媒体概述1.1 媒体的分类1.2 小结2. 多媒体...
自主移动机器人AMR控制器设计... 近年来,随着社会和技术发展,自主移动已经成为了仓储物流[1]、无人驾驶[...
Java Web应用开发——第... 第二章:JSP基本语法测验 一.单项选择题(共15题,49.5分...
代码自动生成工具实战-Curs... 文章目录Cursor code generate介绍Cursor 代码生成实战prompt1prom...
普通Java工程师 VS 优秀... 1 核心能力 1.1 要成为一名优秀的Java架构师 只懂技术还远远不够,懂技术/懂业...
【爬虫】一、前置知识 一、Web请求过程解析 1.服务器渲染:在服务器端把数据和html整合在一起ÿ...
文心一言话题的思考 ⭐️我叫忆_恒心,一名喜欢书写博客的在读研究生👨‍🎓。...
react-native an... 1. 配置环境 必须安装的依赖有:Node、JDK 和 Android Studio。...
若依分离版选择弹窗数据回读 最近学习若依框架过程中想要实现点击按钮显示弹窗,在弹窗选择信息后回读到父组件中显示&#...
板边器件距离不够,导致元器件无... 电子元器件在PCB板上的 合理布局 ,是减少焊接缺点的极重要一环!元器件...
sdbusplus:通过con... sdbusplus:通过new_method_call同步调用service的meth...
骷髅病毒分析 一、病毒信息病毒名称:骷髅病毒文件名称:d5dac2456fa67584...
使用CRT调式库调式运行时堆 #include#include#define CRTDBG_MAP_ALLOC#include #...
Hive的UDF实现两种简单方... Hive的UDF实现两种简单方法+通过编译源码添加UDF 一、实现简单的say_hello ...
211本科生就业难,绝不是个例... 曾几何时,我们在高中时期日以继夜地努力学习,只为在高考中获得更高的分数&...
Java【多线程基础2】 Th... 文章目录前言一、Thread类1, 构造方法2, 常用成员属性3, 常用成员方法3.1, start...
MySQL分区 一张表的数据在物理层面都是存放在一起的。随着业务增长,当一张表的数据量过大时ÿ...