david 2 лет назад
Родитель
Сommit
1677e1fdd8

+ 8 - 9
src/main/java/com/roma/romaapi/controller/PrepareSqlController.java

@@ -1,18 +1,16 @@
 package com.roma.romaapi.controller;
 
 import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.core.type.TypeReference;
-import com.fasterxml.jackson.databind.JavaType;
 import com.fasterxml.jackson.databind.ObjectMapper;
+import jakarta.servlet.http.HttpServletRequest;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.data.redis.core.StringRedisTemplate;
 import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.*;
 import com.roma.romaapi.service.SqlService;
 
+import java.util.Arrays;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -41,9 +39,10 @@ public class PrepareSqlController {
     }
 
     @RequestMapping("/api/{code}")
-    public Map prepareSql(@PathVariable("code") String sqlCode) {
-        // 通过sqlId获取要执行的sql语句
-        Map ret = sqlService.getSql(sqlCode);
+    public Map<String, Object> prepareSql(@PathVariable("code") String sqlCode, HttpServletRequest request) {
+        Map<String, String[]> maps = request.getParameterMap();
+        // 通过sqlId执行sql语句
+        Map<String, Object> ret = sqlService.getSql(sqlCode, maps);
         return ret;
     }
 }

+ 33 - 0
src/main/java/com/roma/romaapi/dao/SqlApiDao.java

@@ -5,9 +5,11 @@ import org.springframework.dao.EmptyResultDataAccessException;
 import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
 import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
 import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.jdbc.core.namedparam.SqlParameterSource;
 import org.springframework.stereotype.Repository;
 
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 
@@ -31,4 +33,35 @@ public class SqlApiDao {
             return resultMap;
         }
     }
+
+    // 获取sql总数,需要完整的sql和要绑定的参数
+    public Integer getSqlCount(String sql, Map bindValue) {
+        Integer count = namedParameterJdbcTemplate.queryForObject(sql, bindValue, Integer.class);
+        return  count;
+    }
+
+    // 获取查询数据--单条数据使用
+    public Map selectData(String sql, Map bindValue) {
+        try {
+            Map<String, Object> resMap2 = namedParameterJdbcTemplate.queryForMap(sql, bindValue);
+            return  resMap2;
+        } catch (EmptyResultDataAccessException e) {
+            Map<String, Object> resultMap = new HashMap<>();
+            resultMap.put("sysErrorCode", "500");
+
+            return resultMap;
+        }
+    }
+
+    // 查询数据--多条数据使用
+    public List<Map<String, Object>> selectMultipleData(String sql, Map<String, Object> bindValue){
+        List<Map<String, Object>> resMap2 = namedParameterJdbcTemplate.queryForList(sql, bindValue);
+        return  resMap2;
+    }
+
+    // 执行删除语句
+    public Integer updateData(String sql, Map<String, Object> bindValue){
+        Integer row = namedParameterJdbcTemplate.update(sql, bindValue);
+        return  row;
+    }
 }

+ 91 - 5
src/main/java/com/roma/romaapi/service/SqlService.java

@@ -4,6 +4,8 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import com.roma.romaapi.dao.SqlApiDao;
 
+import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 @Service
@@ -11,14 +13,98 @@ public class SqlService {
 
     @Autowired
     SqlApiDao sqlApiDao;  // 引入dao层
-    public Map<String, Object> getSql(String sqlCode){
-        Map<String, Object> hasSql = sqlApiDao.getSql(sqlCode);
+    public Map<String, Object> getSql(String sqlCode, Map<String, String[]> maps){
+        Map hasSql = sqlApiDao.getSql(sqlCode);
         boolean isEmpty = hasSql.containsKey("sysErrorCode");
-        if (!isEmpty) {
+        if(isEmpty) {
             return  hasSql;
         }
-        // 如果有sql数据,则转换语句
+        // 获取全部的请求参数
+        Map bindData = new HashMap<>();
+        String page = "1"; // 页数
+        String perPage = "15"; // 显示多少条
+        // 组装要绑定的参数数据
+        for (Map.Entry<String, String[]> entry : maps.entrySet()) {
+            String paramsKey = entry.getKey();
+            String paramsValue = entry.getValue()[0];
+            String fourBeforestring = "";
+            if(paramsKey.length() >= 4) {
+                fourBeforestring = paramsKey.substring(0,4);
+                if (fourBeforestring.equals("api_")) {
+                    bindData.put(paramsKey, paramsValue);
+                }
+            }
+            if(paramsKey.equals("page")) {
+                page = paramsValue;
+            }
+            if(paramsKey.equals("perPage")) {
+                perPage = paramsValue;
+            }
+        }
+
+        Object sqlType = hasSql.get("sql_type");
+        Map ret = new HashMap<>();
+        switch (sqlType.toString()) {
+            case "select":
+                // 查询语句,可带分页,或者不带分页
+                ret = this.transferSelect(hasSql, bindData, page, perPage);
+                break;
+            case "update":
+                Integer updateRow = this.transferUpdate(hasSql, bindData);
+                if(updateRow <= 0) {
+                    ret.put("sysErrorCode", "500");
+                }
+                break;
+            default:
+                break;
+        }
+
+        return ret;
+    }
+
+
+    // 转换查询
+    public Map transferSelect(Map sqlData, Map bindData, String page, String perPage) {
+        Map res = new HashMap<>();
+        Object sql = sqlData.get("detail");// 获取sql语句
+        Object isProcedure = sqlData.get("is_procedure");// 是否存储过程
+        Object isList = sqlData.get("is_list");// 是否查单条数据
+        // 如果不是存储过程
+        if(isProcedure.equals(0)) {
+            if(isList.equals(2)) {
+                // 如果查询单条数据
+                String selectSql = sql.toString();
+                Map info = sqlApiDao.selectData(selectSql, bindData);
+                Integer count = info.isEmpty() ? 0 : 1;
+                res.put("count", count);
+                res.put("rows", info);
+            } else if(isList.equals(1)) {
+                // 如果是查询列表
+                Integer nowPage = Integer.parseInt(page);  // 当前第几页
+                Integer nowPerPage = Integer.parseInt(perPage); // 每页多少条
+                String countSql = "SELECT COUNT(*) AS `totalData` FROM ( " + sql + " ) AS ROMA";
+                Integer count = sqlApiDao.getSqlCount(countSql, bindData);
+                Integer maxPage = count / nowPerPage + (count % nowPerPage != 0 ? 1 : 0);// 总数/每页多少条=最多多少页
+                if (nowPage <= 1) {
+                    nowPage = 1;
+                } else if (maxPage > 0 && nowPage >= maxPage) {
+                    nowPage = maxPage;
+                }
+                Integer startNum = (nowPage - 1) * nowPerPage;
+                String selectSql = sql + " LIMIT " + startNum + "," + nowPerPage;
+                List info = sqlApiDao.selectMultipleData(selectSql, bindData);
+                res.put("count", count);
+                res.put("rows", info);
+            }
+        }
+        return  res;
+    }
+
+    // 执行删除语句
+    public Integer transferUpdate(Map sqlData, Map bindData){
+        Object sql = sqlData.get("detail");// 获取sql语句
+        Integer ret = sqlApiDao.updateData(sql.toString(), bindData);
 
-        return hasSql;
+        return  ret;
     }
 }

+ 1 - 1
src/main/resources/application.properties

@@ -1 +1 @@
-#????
server.port=8081

#?????
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url = jdbc:mysql://172.30.85.127:3306/lowcode?serverTimezone=UTC
spring.datasource.username = root
spring.datasource.password = mypass

#redis
spring.redis.database=0
spring.redis.password=
#spring.redis.password=name:password
spring.redis.port=6379
spring.redis.host=172.17.206.98
spring.redis.timeout=5000
spring.redis.lettuce.pool.max-active=3
spring.redis.lettuce.pool.min-idle=2
spring.redis.lettuce.pool.max-idle=3
spring.redis.lettuce.pool.max-wait=-1
#spring.redis.lettuce.shutdown-timeout=100
#spring.cache.redis.cache-null-values=false


+#服务
server.port=8081

#数据库
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url = jdbc:mysql://172.29.197.37:3306/lowcode?serverTimezone=UTC
spring.datasource.username = root
spring.datasource.password = mypass

#redis
spring.redis.database=0
spring.redis.password=
#spring.redis.password=name:password
spring.redis.port=6379
spring.redis.host=172.17.206.98
spring.redis.timeout=5000
spring.redis.lettuce.pool.max-active=3
spring.redis.lettuce.pool.min-idle=2
spring.redis.lettuce.pool.max-idle=3
spring.redis.lettuce.pool.max-wait=-1
#spring.redis.lettuce.shutdown-timeout=100
#spring.cache.redis.cache-null-values=false