教你用反射机制如何几分钟搭建完后端
创始人
2025-05-28 10:57:53
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);}

相关内容

热门资讯

三国演义初中阅读心得 三国演义初中阅读心得  当在某些事情上我们有很深的体会时,不如来好好地做个总结,写一篇心得体会,这样...
消防培训心得体会 消防培训心得体会13篇  当我们受到启发,对生活有了新的感悟时,马上将其记录下来,这样可以帮助我们总...
上网课心得体会 上网课心得体会(通用10篇)  某些事情让我们心里有了一些心得后,可以将其记录在心得体会中,这样有利...
新时代师德的重要内涵心得 新时代师德的重要内涵心得(精选13篇)  心得体会是指一种读书、实践后所写的感受性文字。语言类读书心...
化学实验安全心得体会 化学实验安全心得体会(通用10篇)  心得体会是指一种读书、实践后所写的感受性文字。语言类读书心得同...
大学生社会实践心得体会150...   而作为一名还未走出校园的学生,我深知自己要学的东西有很多很多,对即将踏入的工作岗位又有着太多的陌...
心态管理培训心得与体会样本三... 心态管理培训心得与体会样本三例  篇一:心态管理培训心得与体会  入职第二天,公司的人事经理对我们新...
实习心得体会 实习心得体会(精选31篇)  当我们经过反思,对生活有了新的看法时,马上将其记录下来,它可以帮助我们...
志愿者活动心得体会 志愿者活动心得体会500字(通用6篇)  当我们经过反思,对生活有了新的看法时,马上将其记录下来,这...
教育名著读书心得 教育名著读书心得(通用29篇)  当我们积累了新的体会时,就十分有必须要写一篇心得体会,这样能够给人...
洛阳实习报告 洛阳实习报告  一段充实而忙碌的实习生活结束了,相信你积累了不少实习心得,让我们一起来学习写实习报告...
《小英雄雨来》读书笔记 《小英雄雨来》读书笔记45篇  读完一本书以后,大家心中一定是萌生了不少心得,何不写一篇读书笔记记录...
团支部个人心得体会 团支部个人心得体会范文(精选5篇)  当我们积累了新的体会时,不如来好好地做个总结,写一篇心得体会,...
劳动节活动心得体会 劳动节活动心得体会(通用5篇)  当在某些事情上我们有很深的体会时,可用写心得体会的方式将其记录下来...
护理学专业的心得体会 护理学专业的心得体会(通用13篇)  在平日里,心中难免会有一些新的想法,马上将其记录下来,这样有利...
工作心得体会感悟 工作心得体会感悟(通用18篇)  从某件事情上得到收获以后,往往会写一篇心得体会,如此就可以提升我们...
采购课程培训心得体会 采购课程培训心得体会范文(通用13篇)  我们心里有一些收获后,可以通过写心得体会的方式将其记录下来...
疫情期间做社区志愿服务心得 疫情期间做社区志愿服务心得  有了一些收获以后,写一篇心得体会,记录下来,这样可以帮助我们分析出现问...
被隔离人员心得体会 被隔离人员心得体会  我们有一些启发后,将其记录在心得体会里,让自己铭记于心,这么做可以让我们不断思...
从优秀到卓越读书心得 从优秀到卓越读书心得(通用18篇)  当阅读了一本名著后,大家心中一定有不少感悟,是时候静下心来好好...