From 60566a69c913c9b850d574e5db1f9c6c6522657b Mon Sep 17 00:00:00 2001 From: lxyer <237809796@qq.com> Date: Thu, 13 Jun 2019 16:53:19 +0800 Subject: [PATCH] =?UTF-8?q?1=E3=80=81=E6=96=B0=E5=A2=9E=E8=87=AA=E5=AE=9A?= =?UTF-8?q?=E4=B9=89=E5=BC=82=E5=B8=B8=E6=8D=95=E8=8E=B7=E5=A4=84=E7=90=86?= =?UTF-8?q?=E7=B1=BB=202=E3=80=81=E6=96=B0=E5=A2=9E=E4=BF=9D=E5=AD=98?= =?UTF-8?q?=E2=80=9C=E4=B8=9A=E5=8A=A1=E6=95=B0=E6=8D=AE=E2=80=9D=E9=80=BB?= =?UTF-8?q?=E8=BE=91=EF=BC=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/net/tccn/base/CfgException.java | 22 +++++ src/main/java/net/tccn/base/Kv.java | 2 +- src/main/java/net/tccn/base/MetaKit.java | 15 +++- .../net/tccn/base/{Liangs.java => X.java} | 16 +++- src/main/java/net/tccn/dbq/DbExecutors.java | 17 ++-- .../java/net/tccn/dbq/jdbc/api/DbKit.java | 7 +- .../java/net/tccn/dbq/parser/ParseArango.java | 2 +- .../java/net/tccn/dbq/parser/ParseEs.java | 2 +- .../java/net/tccn/dbq/parser/ParseMysql.java | 81 ++++++++++++++++++- src/main/java/net/tccn/dbq/parser/Parser.java | 8 +- .../java/net/tccn/dbq/{ => table}/Field.java | 3 +- src/main/java/net/tccn/meta/MetaTable.java | 16 +++- .../net/tccn/service/MetadataService.java | 2 +- .../java/net/tccn/service/_FileService.java | 2 +- .../java/net/tccn/servlet/BaseServlet.java | 7 ++ src/test/java/RunTest.java | 12 ++- 16 files changed, 184 insertions(+), 30 deletions(-) create mode 100644 src/main/java/net/tccn/base/CfgException.java rename src/main/java/net/tccn/base/{Liangs.java => X.java} (83%) rename src/main/java/net/tccn/dbq/{ => table}/Field.java (96%) diff --git a/src/main/java/net/tccn/base/CfgException.java b/src/main/java/net/tccn/base/CfgException.java new file mode 100644 index 0000000..98295e5 --- /dev/null +++ b/src/main/java/net/tccn/base/CfgException.java @@ -0,0 +1,22 @@ +package net.tccn.base; + +import org.redkale.net.http.HttpRequest; + +/** + * 自定义异常处理 + * @author: liangxianyou + */ +public class CfgException extends IllegalArgumentException { + + public CfgException(String msg) { + super(msg); + } + + public CfgException(String msgTpl, Object ... objects) { + super(String.format(msgTpl, objects)); + } + + public void log(HttpRequest request) { + System.out.printf("CfgException: {uri: %s,%n Parameters:%s,%n body: %s} %n", request.getRequestURI(), request.getParameters().toString(), request.getBody()); + } +} diff --git a/src/main/java/net/tccn/base/Kv.java b/src/main/java/net/tccn/base/Kv.java index 96a57e7..0f9b707 100644 --- a/src/main/java/net/tccn/base/Kv.java +++ b/src/main/java/net/tccn/base/Kv.java @@ -48,7 +48,7 @@ public class Kv extends LinkedHashMap { filedS= arr[1]; } - Method method = m.getClass().getDeclaredMethod("get" + Liangs.toUpperCaseFirst(filedS)); + Method method = m.getClass().getDeclaredMethod("get" + X.toUpperCaseFirst(filedS)); if (method != null) { kv.set(filedT, method.invoke(m)); } diff --git a/src/main/java/net/tccn/base/MetaKit.java b/src/main/java/net/tccn/base/MetaKit.java index 30de9c3..891906a 100644 --- a/src/main/java/net/tccn/base/MetaKit.java +++ b/src/main/java/net/tccn/base/MetaKit.java @@ -2,7 +2,7 @@ package net.tccn.base; import lombok.Getter; import net.tccn.base.arango.Doc; -import net.tccn.dbq.Field; +import net.tccn.dbq.table.Field; import net.tccn.dbq.fbean.FilterType; import net.tccn.dbq.jdbc.api.DbAccount; import net.tccn.dbq.jdbc.api.DbKit; @@ -140,6 +140,17 @@ public final class MetaKit { } } + /** + * 得到业务主表 + * @param serviceName + * @param token + * @return + */ + public static MetaTable getMainTable(String serviceName, String token) { + MetaService metaService = MetaKit.getMetaService(serviceName, token); + return MetaKit.getMetaTableByAlias(metaService.getTable()); + } + // ----------------------------------- public void cleanData() { @@ -434,7 +445,7 @@ public final class MetaKit { Set allAlias; if (!all) { - allAlias = Liangs.concat( + allAlias = X.concat( metaService.getFilters().stream().map(f -> { String col = (String) f.getName(); String alias = col.split("[.]")[0]; diff --git a/src/main/java/net/tccn/base/Liangs.java b/src/main/java/net/tccn/base/X.java similarity index 83% rename from src/main/java/net/tccn/base/Liangs.java rename to src/main/java/net/tccn/base/X.java index f279079..2bb9814 100644 --- a/src/main/java/net/tccn/base/Liangs.java +++ b/src/main/java/net/tccn/base/X.java @@ -8,7 +8,7 @@ import java.util.stream.Stream; /** * Created by liangxianyou at 2019/3/19 18:01. */ -public class Liangs { +public class X { /** * 将集合数组合并到一个Set 集合中 @@ -85,4 +85,18 @@ public class Liangs { return null; } + public static boolean isEmpty(Object obj) { + if (obj == null) + return true; + if (obj instanceof List) + return ((List) obj).isEmpty(); + if (obj instanceof String) + return ((String) obj).isEmpty(); + if (obj instanceof Map) + return ((Map) obj).isEmpty(); + if (obj instanceof Collection) + return ((Collection) obj).isEmpty(); + return false; + } + } diff --git a/src/main/java/net/tccn/dbq/DbExecutors.java b/src/main/java/net/tccn/dbq/DbExecutors.java index ba725a9..8ae1cd7 100644 --- a/src/main/java/net/tccn/dbq/DbExecutors.java +++ b/src/main/java/net/tccn/dbq/DbExecutors.java @@ -13,18 +13,19 @@ import java.util.Map; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; +/** + * Db 调度层 + */ public class DbExecutors { private final static ParseMysql PARSER = new ParseMysql(); public static PageBean findPage(FBean fBean) throws ExecutionException, InterruptedException { //sql解析 - String[] sqls = PARSER.parse(fBean); + String[] sqls = PARSER.parseList(fBean); //当前的业务 => 获取主表 信息 => 数据源信息 => 数据源对象 => 创建数据工具对象 => 查询数据 MetaService metaService = MetaKit.getMetaService(fBean.getName(), fBean.getPlatToken()); - MetaTable mainTable = MetaKit.getMetaTableByAlias(metaService.getTable()); - DbKit dbKit = MetaKit.getDbKit(mainTable.getDbPlatId(), mainTable.getCatalog()); //System.out.printf("----------------%n countSql:%s%n findSql:%s%n----------------%n", sqls[0], sqls[1]); @@ -39,12 +40,18 @@ public class DbExecutors { public static void del(String name, Map data, String token) { MetaService metaService = MetaKit.getMetaService(name, token); - MetaTable mainTable = MetaKit.getMetaTableByAlias(metaService.getTable()); - DbKit dbKit = MetaKit.getDbKit(mainTable.getDbPlatId(), mainTable.getCatalog()); String delSql = PARSER.parseDel(name, data, token); dbKit.exetute(delSql); } + + public static void save(String name, Map data, String token) { + MetaTable mainTable = MetaKit.getMainTable(name, token); + DbKit dbKit = MetaKit.getDbKit(mainTable.getDbPlatId(), mainTable.getCatalog()); + + String sql = PARSER.parseSave(name, data, token); + dbKit.exetute(sql); + } } diff --git a/src/main/java/net/tccn/dbq/jdbc/api/DbKit.java b/src/main/java/net/tccn/dbq/jdbc/api/DbKit.java index ae5a4d4..cffdddd 100644 --- a/src/main/java/net/tccn/dbq/jdbc/api/DbKit.java +++ b/src/main/java/net/tccn/dbq/jdbc/api/DbKit.java @@ -1,11 +1,12 @@ package net.tccn.dbq.jdbc.api; -import net.tccn.base.Liangs; +import net.tccn.base.X; import java.util.List; import java.util.concurrent.CompletableFuture; /** + * Db 最终执行层 * Created by liangxianyou at 2019/3/12 14:11. */ public class DbKit implements DbSource{ @@ -17,7 +18,7 @@ public class DbKit implements DbSource{ /*public DbKit(DbAccount dbAccount) { this.dbAccount = dbAccount; try { - DbSource dbSource = Liangs.getDbSource(DbSource.class, dbAccount.getCate()); + DbSource dbSource = X.getDbSource(DbSource.class, dbAccount.getCate()); dbSource.setDbAccount(dbAccount); this.dbSource = dbSource; @@ -30,7 +31,7 @@ public class DbKit implements DbSource{ this.catalog = catalog; try { - DbSource dbSource = Liangs.getDbSource(DbSource.class, dbAccount.getCate()); + DbSource dbSource = X.getDbSource(DbSource.class, dbAccount.getCate()); dbSource.setDbAccount(dbAccount); dbSource.setCatalog(catalog); diff --git a/src/main/java/net/tccn/dbq/parser/ParseArango.java b/src/main/java/net/tccn/dbq/parser/ParseArango.java index b724a8a..ad433d1 100644 --- a/src/main/java/net/tccn/dbq/parser/ParseArango.java +++ b/src/main/java/net/tccn/dbq/parser/ParseArango.java @@ -8,7 +8,7 @@ import net.tccn.dbq.fbean.FBean; public class ParseArango implements Parser { @Override - public String[] parse(FBean fBean) { + public String[] parseList(FBean fBean) { return new String[0]; } } diff --git a/src/main/java/net/tccn/dbq/parser/ParseEs.java b/src/main/java/net/tccn/dbq/parser/ParseEs.java index eda0a62..0d8a598 100644 --- a/src/main/java/net/tccn/dbq/parser/ParseEs.java +++ b/src/main/java/net/tccn/dbq/parser/ParseEs.java @@ -9,7 +9,7 @@ public class ParseEs implements Parser { @Override - public String[] parse(FBean fBean) { + public String[] parseList(FBean fBean) { return new String[0]; } } diff --git a/src/main/java/net/tccn/dbq/parser/ParseMysql.java b/src/main/java/net/tccn/dbq/parser/ParseMysql.java index 95c446e..41da6df 100644 --- a/src/main/java/net/tccn/dbq/parser/ParseMysql.java +++ b/src/main/java/net/tccn/dbq/parser/ParseMysql.java @@ -1,8 +1,6 @@ package net.tccn.dbq.parser; -import net.tccn.base.Kv; -import net.tccn.base.MetaKit; -import net.tccn.base.TplKit; +import net.tccn.base.*; import net.tccn.dbq.fbean.*; import net.tccn.meta.MetaLink; import net.tccn.meta.MetaService; @@ -48,8 +46,13 @@ public class ParseMysql implements Parser { return true; }; + /** + * 查询数据解析 + * @param fBean + * @return + */ @Override - public String[] parse(FBean fBean) { + public String[] parseList(FBean fBean) { MetaService metaService = MetaKit.getMetaService(fBean.getName(), fBean.getPlatToken()); Kv tables = MetaKit.getMetaTables(metaService, false);//所有的关联表信息 @@ -134,6 +137,13 @@ public class ParseMysql implements Parser { return null; } + /** + * 删除执行语句解析 + * @param name + * @param data + * @param token + * @return + */ public String parseDel(String name, Map data, String token) { MetaService metaService = MetaKit.getMetaService(name, token); Map dels = metaService.getDels(); @@ -151,4 +161,67 @@ public class ParseMysql implements Parser { return sql; } + + /** + * 保存数据解析逻辑: + * 1.得到主表信息 + * 2.根据主表信息 使用数据创建sql + * @param serviceName 业务名称 + * @param data 待保存的数据 + * @param token 平台token + * @return sql 待执行的sql语句 + */ + public String parseSave(String serviceName, Map data, String token) { + MetaTable mainTable = MetaKit.getMainTable(serviceName, token); + String alias = mainTable.getAlias(); + String[] pks = mainTable.pk(); + + // 取出有效的数据key + List keys = data.keySet() + .stream() + .filter(x -> + x.startsWith(alias + ".") || !X.isEmpty(data.get(alias + "." + x)) + ).collect(Collectors.toList()); + if (pks.length == 0) { + throw new CfgException("保存数据失败,检查业务主表[%s-%S]主键配置", mainTable.getName(), mainTable.getComment()); + } else if (keys.size() == 0) { + throw new CfgException("保存数据失败,提交数据不能改空"); + } + + + //单主键 + String pv = data.get(alias + "." + pks[0]); + if (X.isEmpty(pv)) { //新增 + String sqlTpl = "INSERT INTO `%s` (%s) VALUES %s;"; // para: table、 ks、 vs + StringBuffer ks = new StringBuffer();// `k1`,`k2`,`k3`, ... + StringBuffer vs = new StringBuffer();// `v1`,`v2`,`v3`, ... + + for (String k : keys) { + ks.append(String.format("`%s`,", k)); + vs.append(String.format("'%s',", data.get(alias + "." + k))); + } + if (ks.length() > 0) { + ks.deleteCharAt(ks.length() - 1); + vs.deleteCharAt(vs.length() - 1); + } + + return String.format(sqlTpl, mainTable.getName(), ks, vs); + } + + else { //修改 + String sqlTpl = "update `%s` set %s where `%s` = '%s';"; // para: table、 kvs、 pk、 pv + StringBuilder kvs = new StringBuilder(); // `k1`='v1',`k2`='v2', ... + String pk = pks[0]; + + for (String k : keys) { + kvs.append(String.format("`%s`='%s',", k, data.get(alias + "." + k))); + } + + if (kvs.length() > 0) { + kvs.deleteCharAt(kvs.length() - 1); + } + + return String.format(sqlTpl, mainTable.getName(), kvs, pk, pv); + } + } } diff --git a/src/main/java/net/tccn/dbq/parser/Parser.java b/src/main/java/net/tccn/dbq/parser/Parser.java index 5197063..edbf64a 100644 --- a/src/main/java/net/tccn/dbq/parser/Parser.java +++ b/src/main/java/net/tccn/dbq/parser/Parser.java @@ -3,6 +3,7 @@ package net.tccn.dbq.parser; import net.tccn.dbq.fbean.FBean; /** + * Db 执行解释层 * Created by liangxianyou at 2018/12/24 15:47. */ public interface Parser { @@ -12,13 +13,8 @@ public interface Parser { * @param fBean * @return [countSql, listSql] */ - String[] parse(FBean fBean); + String[] parseList(FBean fBean); - /** - * 解析一个查询条件 - * @param filter - */ - //String parse(Filter filter); /** * 解析入库语句 diff --git a/src/main/java/net/tccn/dbq/Field.java b/src/main/java/net/tccn/dbq/table/Field.java similarity index 96% rename from src/main/java/net/tccn/dbq/Field.java rename to src/main/java/net/tccn/dbq/table/Field.java index ce36944..1195849 100644 --- a/src/main/java/net/tccn/dbq/Field.java +++ b/src/main/java/net/tccn/dbq/table/Field.java @@ -1,7 +1,6 @@ -package net.tccn.dbq; +package net.tccn.dbq.table; import lombok.Data; -import net.tccn.dbq.table.Column; /** * @author: liangxianyou at 2018/10/17 17:24. diff --git a/src/main/java/net/tccn/meta/MetaTable.java b/src/main/java/net/tccn/meta/MetaTable.java index df5a3c1..4a1de41 100644 --- a/src/main/java/net/tccn/meta/MetaTable.java +++ b/src/main/java/net/tccn/meta/MetaTable.java @@ -2,11 +2,12 @@ package net.tccn.meta; import lombok.Data; import net.tccn.base.arango.Doc; -import net.tccn.dbq.Field; +import net.tccn.dbq.table.Field; import javax.persistence.Table; import java.io.Serializable; import java.util.List; +import java.util.Optional; import java.util.stream.Collectors; /** @@ -40,4 +41,17 @@ public class MetaTable extends Doc implements Serializable { return _bean; } + + // 方法名getPK 报错, + public String[] pk() { + List pks = items.stream().filter(x -> x.getPk() != null && x.getPk()).map(x -> x.getName()).collect(Collectors.toList()); + + if (pks.size() > 0) { + return pks.toArray(new String[pks.size()]); + } + + //存在id字段,取id + Optional any = items.stream().filter(x -> x.getName().equalsIgnoreCase("id")).findAny(); + return any.isPresent() ? new String[]{"id"} : new String[0]; + } } diff --git a/src/main/java/net/tccn/service/MetadataService.java b/src/main/java/net/tccn/service/MetadataService.java index 73a4b2b..5405e13 100644 --- a/src/main/java/net/tccn/service/MetadataService.java +++ b/src/main/java/net/tccn/service/MetadataService.java @@ -3,7 +3,7 @@ package net.tccn.service; import net.tccn.base.JBean; import net.tccn.base.Kv; import net.tccn.base.MetaKit; -import net.tccn.dbq.Field; +import net.tccn.dbq.table.Field; import net.tccn.meta.*; import net.tccn.plat.SysPlat; import org.redkale.net.http.RestMapping; diff --git a/src/main/java/net/tccn/service/_FileService.java b/src/main/java/net/tccn/service/_FileService.java index 761fdc4..f495650 100644 --- a/src/main/java/net/tccn/service/_FileService.java +++ b/src/main/java/net/tccn/service/_FileService.java @@ -4,7 +4,7 @@ import net.tccn.base.ExcelKit; import net.tccn.base.JBean; import net.tccn.base.Kv; import net.tccn.base.MetaKit; -import net.tccn.dbq.Field; +import net.tccn.dbq.table.Field; import net.tccn.meta.MetaTable; import net.tccn.plat.SysPlat; import org.redkale.net.http.RestMapping; diff --git a/src/main/java/net/tccn/servlet/BaseServlet.java b/src/main/java/net/tccn/servlet/BaseServlet.java index a99d1ed..4a274e2 100644 --- a/src/main/java/net/tccn/servlet/BaseServlet.java +++ b/src/main/java/net/tccn/servlet/BaseServlet.java @@ -1,6 +1,7 @@ package net.tccn.servlet; import com.arangodb.ArangoDBException; +import net.tccn.base.CfgException; import net.tccn.base.JBean; import net.tccn.base.Kv; import net.tccn.base.arango.ArangoSource; @@ -73,6 +74,12 @@ public class BaseServlet extends HttpServlet { } catch (UnsupportedOperationException e) { e.printStackTrace(); response.finish(JBean.by(-1, e.getMessage())); + } catch (CfgException e) { // 系统元数据配置异常 + e.printStackTrace(); + System.out.println("-------------------------------------------"); + e.log(request); + System.out.println("-------------------------------------------"); + response.finish(JBean.by(-1, e.getMessage())); } } diff --git a/src/test/java/RunTest.java b/src/test/java/RunTest.java index af154b8..03b208d 100644 --- a/src/test/java/RunTest.java +++ b/src/test/java/RunTest.java @@ -60,7 +60,7 @@ public class RunTest { //FBean fBean = new Gson().fromJson(str, FBean.class); FBean fBean = convert.convertFrom(FBean.class, str); - String[] parse = parser.parse(fBean); + String[] parse = parser.parseList(fBean); System.out.println("count:" + parse[0]); System.out.println("list:" + parse[1]); @@ -370,4 +370,14 @@ public class RunTest { System.out.println("end"); } + @Test + public void exceptionTest() { + + try { + throw new CfgException("hello exception: %s - %s - %s", 1, 2, "x"); + } catch (Exception e) { + System.out.println(e.getMessage()); + } + } + }