如果想快速搭建后台跨域使用这些技术
反射可以实现动态数据的传输
一般对数据库进行操作肯定离不开这些代码
如果我们用反射机制只需要这一个就行
而说到反射的好处,一般情况下我们做增删改查需要大量的接口才能完成,而用反射我们需要一个接口就能完成,如果觉得代码臃肿可以进行细分为四个接口分别是增删改查四个接口。
这是数据库的数据
现在我要查询Studnet里第一条数据,我可以用json传给后台的数据如下
{"class":"Student","type":"getOne","data":{"Sno":060101}}
查询结果
再比如我要查询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表里插入数据可以这样
[{"key":"data","value":"{\"class\":\"Student\",\"type\":\"save\",\"data\":{\"Sno\":06010123,\"Sname\":\"樱木花道\",\"Ssex\":\"男\"}}","description":"","type":"default","enabled":true}]
如果想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 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;}
}
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;}}
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;}
}
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));}}
}
@Autowiredprivate ApplicationContext applicationContext;@PostMapping("/getData")public Object getData(String data) throws Exception {return ReflexController.Controller(applicationContext,data);}
下一篇:数据库系统-SQL