diff --git a/apidoc.html b/apidoc.html index 112ff87..c6cd037 100644 --- a/apidoc.html +++ b/apidoc.html @@ -103,7 +103,7 @@ diff --git a/pom.xml b/pom.xml index 14e52c6..2635ec9 100644 --- a/pom.xml +++ b/pom.xml @@ -21,6 +21,13 @@ 1.9.9 + + + mysql + mysql-connector-java + 5.1.46 + + com.arangodb diff --git a/root/metadata/metaService.html b/root/metadata/metaService.html index b393663..7bc491a 100644 --- a/root/metadata/metaService.html +++ b/root/metadata/metaService.html @@ -1,29 +1,19 @@ +
- - - - - - - - - @@ -38,11 +28,6 @@ - - - - - @@ -98,7 +83,8 @@
-
+ + + +
列表展示的属性
@@ -284,6 +272,8 @@ filterCate: ["EQUAL", "NOTEQUAL", "LIKE", "IN"], tables: [],//所有的业务类型,【测试用】 meta: { + name:"", + table:"", items: [], shows: [], exports: [], @@ -346,9 +336,9 @@ vm.row = {key:v.key, dbPlatId: v.dbPlatId, catalog: v.catalog}; vm.filters = v.filters; var filterArr = []; - vm.filters.forEach(function (item) { + /*vm.filters.forEach(function (item) { filterArr.push(item.name); - }) + })*/ vm.filterArr = filterArr; }, filterArr: function (v) { @@ -381,6 +371,11 @@ //this.status = 0; red.getJSON("/meta/tableinfo",{name: cate}, function (json) { var row = json; + row.shows = row.shows || []; + row.exports = row.exports || []; + row.imports = row.imports || []; + row.filters = row.filters || []; + vm.meta = row; var oldItems = []; diff --git a/src/main/java/net/tccn/base/Kv.java b/src/main/java/net/tccn/base/Kv.java index ffeac98..5284055 100644 --- a/src/main/java/net/tccn/base/Kv.java +++ b/src/main/java/net/tccn/base/Kv.java @@ -5,19 +5,14 @@ import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.text.ParseException; import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Date; -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.function.Function; import java.util.function.Predicate; /** * Created by liangxianyou@eversec.cn at 2018/3/12 14:17. */ -public class Kv extends LinkedHashMap { +public class Kv extends LinkedHashMap { public static Kv of(){ return new Kv(); } @@ -77,69 +72,31 @@ public class Kv extends LinkedHashMap { || t == Double.class || t == double.class ; }; - public static T toBean(Map m, Class type) { + public static T toBean(Map m, Class type) { try { Object obj = type.newInstance(); m.forEach((k, v) -> { - String methodName = "set" + upFirst.apply(k); - Method method = null; + String methodName = "set" + upFirst.apply(k+""); Class[] clazzs = clazzMap.get(v == null ? null : v.getClass()); if (clazzs == null) { //doc.set(k, v); } else { for (Class clazz : clazzs) { + Method method = null; try { method = type.getDeclaredMethod(methodName, clazz); } catch (NoSuchMethodException e) { } if (method != null) { try { - if (v == null || "".equals(v)) { - - } else if (v.getClass() == Long.class && clazz != Long.class) {//多种数值类型的处理 - Object _v; - switch (clazz.getSimpleName()) { - case "int": - case "Long": _v = v; break; - case "Integer": _v = (int)((long) v); break; - case "short": - case "Short": _v = (short)((long) v); break; - default: _v = v; - } - method.invoke(obj, _v); - } else if (v.getClass() == Double.class) { - Object _v = null; - if (isNumber.test(clazz)) { - switch (clazz.getSimpleName()) { - case "long": - case "Long": _v = (long)(double) v; break; - case "int": - case "Integer": _v = (int)((double) v); break; - case "short": - case "Short": _v = (int)(double) v; break; - default: _v = v; - } - } else if (clazz == String.class){ - _v = String.valueOf(v); - } - method.invoke(obj, _v); - } else if (v.getClass() == String.class && clazz == Date.class) { - Date _v = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse((String) v); - method.invoke(obj, _v); - } else if (v.getClass() == String.class && clazz == Integer.class) { - Object _v = (int)Double.parseDouble((String) v); - method.invoke(obj, _v); - } - - else { - method.invoke(obj, v); - } + Object _v = toAs(v, clazz); + //如发现 映射异常,打开下面的注释查看 进行映射的值,并对上面的值转换过程升级 + //System.out.printf("%s:%s %s%n", k,v, v.getClass()); + method.invoke(obj, _v); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); - } catch (ParseException e) { - e.printStackTrace(); } break; } @@ -153,4 +110,70 @@ public class Kv extends LinkedHashMap { } return null; } + + public static T toAs(Object v, Class clazz) { + if (v == null) { + return null; + } + if (v.getClass() == clazz) { + return (T) v; + } + + Object _v = null; + try { + if (v == null || "".equals(v)) { + + } else if (v.getClass() == Long.class && clazz != Long.class) {//多种数值类型的处理: Long => x + switch (clazz.getSimpleName()) { + case "int": + case "Integer": _v = (int)(long) v; break; + case "short": + case "Short": _v = (short)(long) v; break; + case "float": + case "Float": _v = (float)(long) v; break; + default: _v = v; + } + } else if (v.getClass() == Double.class && clazz != Double.class) { + if (isNumber.test(clazz)) { + switch (clazz.getSimpleName()) { + case "long": + case "Long": _v = (long)(double) v; break; + case "int": + case "Integer": _v = (int)(double) v; break; + case "short": + case "Short": _v = (short)(double) v; break; + case "float": + case "Float": _v = (float)(double) v; break; + default: _v = v; + } + } else if (clazz == String.class){ + _v = String.valueOf(v); + } + } else if (v.getClass() == String.class) { + switch (clazz.getSimpleName()) { + case "Date": + _v = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse((String) v); break; + //string ==> number + case "short": + case "Short": _v = (short)Double.parseDouble((String) v); break; + case "float": + case "Float": _v = (float)Double.parseDouble((String) v); break; + case "int": + case "Integer": _v = (int)Double.parseDouble((String) v); break; + case "long": + case "Long": _v = (long)Double.parseDouble((String) v); break; + case "double": + case "Double": _v = Double.parseDouble((String) v); break; + default: _v = v; + } + } + + else { + _v = v; + } + } catch (ParseException e) { + e.printStackTrace(); + } + return (T) _v; + } } \ No newline at end of file diff --git a/src/main/java/net/tccn/base/RealType.java b/src/main/java/net/tccn/base/RealType.java new file mode 100644 index 0000000..927b41d --- /dev/null +++ b/src/main/java/net/tccn/base/RealType.java @@ -0,0 +1,19 @@ +package net.tccn.base; + +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; + +/** + * Created by liangxianyou at 2019/3/15 16:39. + */ +public class RealType { + public Class getType() { + + Type type = this.getClass().getGenericSuperclass(); + ParameterizedType p=(ParameterizedType)type; + + Class c=(Class) p.getActualTypeArguments()[0]; + System.out.println(c.getName()); + return c; + } +} diff --git a/src/main/java/net/tccn/base/arango/Doc.java b/src/main/java/net/tccn/base/arango/Doc.java index eed24b6..bb22336 100644 --- a/src/main/java/net/tccn/base/arango/Doc.java +++ b/src/main/java/net/tccn/base/arango/Doc.java @@ -55,7 +55,7 @@ public abstract class Doc { return (V)attr.get(k); } - public T setShows(String... show) { + /*public T setShows(String... show) { if (_shows == null) { _shows = new HashSet<>(); } @@ -63,15 +63,15 @@ public abstract class Doc { _shows.add(s); } return (T) this; - } + }*/ public Set get_Shows() { return _shows; } - public void set_Shows(Set shows) { + /*public void set_Shows(Set shows) { this._shows = shows; - } + }*/ public T setOrder(String col, int desc) { if (_order == null) { diff --git a/src/main/java/net/tccn/dbq/fbean/FBean.java b/src/main/java/net/tccn/dbq/fbean/FBean.java index b922c9e..4028b8f 100644 --- a/src/main/java/net/tccn/dbq/fbean/FBean.java +++ b/src/main/java/net/tccn/dbq/fbean/FBean.java @@ -49,6 +49,7 @@ public class FBean { //----------------------------------- //组装查询sql,[list, count] + @Deprecated public String[] buildSqlFilter() { //where 1=1 and x=1 and y=1 order by x,y limit 1,3; String where = Filter.filter(filters); @@ -63,7 +64,7 @@ public class FBean { return new String[]{list, count}; } - + @Deprecated public void setLimit(int pn, int ps) { limit.setPn(pn); limit.setPs(ps); diff --git a/src/main/java/net/tccn/dbq/fbean/ParseArango.java b/src/main/java/net/tccn/dbq/fbean/ParseArango.java index b3b1739..ac40f56 100644 --- a/src/main/java/net/tccn/dbq/fbean/ParseArango.java +++ b/src/main/java/net/tccn/dbq/fbean/ParseArango.java @@ -1,29 +1,12 @@ package net.tccn.dbq.fbean; -import net.tccn.meta.MetaService; - -import java.util.Map; - /** * Created by liangxianyou at 2018/12/24 15:49. */ public class ParseArango implements Parser { @Override - public String parse(FBean fBean) { - - - - return null; - } - - @Override - public String parse(Filter filter) { - return null; - } - - @Override - public String parseSave(MetaService ms, Map data) { - return ""; + public String[] parse(FBean fBean) { + return new String[0]; } } diff --git a/src/main/java/net/tccn/dbq/fbean/ParseEs.java b/src/main/java/net/tccn/dbq/fbean/ParseEs.java index 80a4be4..2ec8d3c 100644 --- a/src/main/java/net/tccn/dbq/fbean/ParseEs.java +++ b/src/main/java/net/tccn/dbq/fbean/ParseEs.java @@ -1,26 +1,13 @@ package net.tccn.dbq.fbean; -import net.tccn.meta.MetaService; - -import java.util.Map; - /** * Created by liangxianyou at 2018/12/24 15:49. */ public class ParseEs implements Parser { - @Override - public String parse(FBean fBean) { - return null; - } @Override - public String parse(Filter filter) { - return null; - } - - @Override - public String parseSave(MetaService ms, Map data) { - return ""; + public String[] parse(FBean fBean) { + return new String[0]; } } diff --git a/src/main/java/net/tccn/dbq/fbean/ParseMysql.java b/src/main/java/net/tccn/dbq/fbean/ParseMysql.java index 25d852b..abe7e42 100644 --- a/src/main/java/net/tccn/dbq/fbean/ParseMysql.java +++ b/src/main/java/net/tccn/dbq/fbean/ParseMysql.java @@ -1,5 +1,6 @@ package net.tccn.dbq.fbean; +import net.tccn.base.Kv; import net.tccn.meta.MetaKit; import net.tccn.meta.MetaLink; import net.tccn.meta.MetaService; @@ -8,9 +9,17 @@ import net.tccn.meta.MetaTable; import java.util.Collection; import java.util.List; import java.util.Map; +import java.util.function.BiFunction; +import java.util.function.Function; import java.util.function.Predicate; +import java.util.stream.Collectors; + +import static java.util.Arrays.asList; /** + * 查询的数据是否同库, + * 是:支持副表过滤 + * 否:只支持主表过滤 * Created by liangxianyou at 2018/12/24 15:49. */ public class ParseMysql implements Parser { @@ -29,75 +38,154 @@ public class ParseMysql implements Parser { return false; }; + BiFunction buildFilter = (f, cate) -> { + + return null; + }; + + @Deprecated + Function> tablesFun = fbean -> { + MetaService metaService = MetaKit.metaService(fbean.getName()); + List filters = fbean.getFilters(); + List shows = metaService.getShows(); + + Kv tables = Kv.of(); + + shows.forEach(x-> { + String table = x.split("[.]")[0]; + tables.set(table, MetaKit.getMetaTableByAlias(table)); + }); + filters.forEach(f -> { + String table = f.getCol().split("[.]")[0]; + if (!tables.containsKey(table)) { + tables.set(table, MetaKit.getMetaTableByAlias(table)); + } + }); + + metaService.getShows(); + + //查询用的过滤条件 + Map> filterMap = filters.stream().collect(Collectors.groupingBy(x -> x.getCol().split("[.]")[0])); + //要展示的数据 + Map> showMap = shows.stream().collect(Collectors.groupingBy(x -> x.split("[.]")[0])); + + + StringBuffer bufWhere = new StringBuffer(); + + filterMap.getOrDefault(metaService.getTable(), asList()).forEach(f -> { + + + bufWhere.append(f.getCol()).append(f.getType()).append(f.getValue()); + }); + + + //select * from tableA a left join tableB b on a.xx = b.yy where b.zz = xxx; + //where tableB where b. + + //是否跨库 + + + + return tables; + }; + + Predicate> sameDbFun = (kv) -> { + String dbPlatId = null; + for (MetaTable table : kv.values()) { + if (dbPlatId == null) { + dbPlatId = table.getDbPlatId(); + } else if (!dbPlatId.equals(table.getDbPlatId())) { + return false; + } + } + return true; + }; + @Override - public String parse(FBean fBean) { + public String[] parse(FBean fBean) { MetaService metaService = MetaKit.metaService(fBean.getName()); - //基础属性 - MetaTable metaTable = metaService.getMetaTable();//基础元数据 - List linkTables = metaService.getMetaLinks();//表关联条件 - Map attachTable = metaService.getTables();//用到的关联表 + Kv tables = tablesFun.apply(fBean);//所有的关联表信息 + MetaTable metaTable = tables.get(metaService.getTable());//基础元数据 List shows = metaService.getShows();//查询的属性 + List _filters = fBean.getFilters().stream().map(Filter::getCol).collect(Collectors.toList()); + List links = MetaKit.getMetaLinks(metaService.getTable(), shows, _filters); + //查询条件 List filters = fBean.getFilters(); Limit limit = fBean.getLimit(); List orders = fBean.getOrders(); - StringBuilder buf = new StringBuilder(); - //select - buf.append("select "); - if (!isEmpty.test(shows)) { - shows.forEach(x -> { - //buf.append("`").append("x").append("`").append(","); - buf.append(x).append(","); - }); - buf.deleteCharAt(buf.length() - 1); - } else { - buf.append("*"); - } + //Map> filterMap = filters.stream().collect(Collectors.groupingBy(x -> x.getCol().split("[.]")[0])); + //Map> showMap = shows.stream().collect(Collectors.groupingBy(x -> x.split("[.]")[0])); - //from - buf.append(" from ").append("`").append(metaTable.getName()).append("` ").append(metaTable.getAlias()); - //left join - if (!isEmpty.test(linkTables)) { - linkTables.forEach(x -> { - MetaTable leftTable = attachTable.get(metaTable.getAlias().equals(x.getTables()[0]) ? x.getTables()[1] : x.getTables()[0]); + //判断是否为同库 + if (sameDbFun.test(tables)) { + // where 1=1 and xx=xx + StringBuffer bufWhere = new StringBuffer(); + if (!isEmpty.test(filters)) { + bufWhere.append(Filter.filter(filters, DbType.MYSQL)); + } - buf.append(" left join ").append(leftTable.getName()).append(" ").append(leftTable.getAlias()).append(" on "); - int tag = buf.length(); - x.getLink().forEach((k,v) -> { - if (buf.length() > tag) { - buf.append(" and "); - } - buf.append(k).append("=").append(v); + //select a.x, b.y, c.z + StringBuffer bufSelect = new StringBuffer(); + bufSelect.append("select "); + if (!isEmpty.test(shows)) { + shows.forEach(x -> { + //buf.append("`").append("x").append("`").append(","); + bufSelect.append(x).append(","); }); - }); + bufSelect.deleteCharAt(bufSelect.length() - 1); + } else { + bufSelect.append("*"); + } + + //from + StringBuilder bufFrom = new StringBuilder(); + bufFrom.append(" from ").append(metaTable.getCatalog()).append(".`").append(metaTable.getName()).append("` ").append(metaTable.getAlias()); + //left join + if (!isEmpty.test(links)) { + links.forEach(x -> { + MetaTable rightTable = tables.get(metaTable.getAlias().equals(x.getTables()[0]) ? x.getTables()[1] : x.getTables()[0]); + bufFrom.append(" left join ").append(rightTable.getCatalog()).append(".").append(rightTable.getName()).append(" ").append(rightTable.getAlias()).append(" on "); + int tag = bufFrom.length(); + x.getLink().forEach((k,v) -> { + if (bufFrom.length() > tag) { + bufFrom.append(" and "); + } + bufFrom.append(k).append("=").append(v); + }); + }); + } + + StringBuffer bufOth = new StringBuffer(); + //order by + if (!isEmpty.test(orders)) { + bufOth.append(" ").append(Order.order(orders, DbType.MYSQL)); + } + //limit + bufOth.append(" ").append(limit.limit()); + + return new String[]{ + "select count(1) " + bufFrom + bufWhere, + "" + bufSelect + bufFrom + bufWhere + bufOth + }; } - //where - if (!isEmpty.test(filters)) { - buf.append(Filter.filter(filters, DbType.MYSQL)); - } - - //order by - if (!isEmpty.test(orders)) { - buf.append(" ").append(Order.order(orders, DbType.MYSQL)); - } - - //limit - buf.append(" ").append(limit.limit()); - return buf.toString(); + return null; } - @Override + /*@Override public String parse(Filter filter) { return null; } @Override public String parseSave(MetaService ms, Map data) { + MetaTable metaTable = MetaKit.getMetaTableByAlias(ms.getName());//基础元数据 + String sqlTpl = "insert %s (%s) value (%s)"; StringBuilder bufK = new StringBuilder(); StringBuilder bufV = new StringBuilder(); @@ -113,6 +201,6 @@ public class ParseMysql implements Parser { }); bufK.deleteCharAt(bufK.length() - 1); bufV.deleteCharAt(bufV.length() - 1); - return String.format(sqlTpl, ms.getMetaTable().getName(), bufK.toString(), bufV.toString()); - } + return String.format(sqlTpl, metaTable.getName(), bufK.toString(), bufV.toString()); + }*/ } diff --git a/src/main/java/net/tccn/dbq/fbean/Parser.java b/src/main/java/net/tccn/dbq/fbean/Parser.java index 31a1467..5e097b5 100644 --- a/src/main/java/net/tccn/dbq/fbean/Parser.java +++ b/src/main/java/net/tccn/dbq/fbean/Parser.java @@ -10,22 +10,23 @@ import java.util.Map; public interface Parser { /** - * 组装完整的查询条件 + * 组装完整分页查询 * @param fBean + * @return [countSql, listSql] */ - String parse(FBean fBean); + String[] parse(FBean fBean); /** * 解析一个查询条件 * @param filter */ - String parse(Filter filter); + //String parse(Filter filter); /** * 解析入库语句 * @param data * @return */ - String parseSave(MetaService ms, Map data); + //String parseSave(MetaService ms, Map data); } diff --git a/src/main/java/net/tccn/dbq/jdbc/JdbcAccount.java b/src/main/java/net/tccn/dbq/jdbc/JdbcAccount.java index a9142d9..4918bd6 100644 --- a/src/main/java/net/tccn/dbq/jdbc/JdbcAccount.java +++ b/src/main/java/net/tccn/dbq/jdbc/JdbcAccount.java @@ -10,10 +10,11 @@ public class JdbcAccount { private String url; private String user; private String pwd; + private String cate;//数据库类型 private Integer connectMax = 5;//默认最大连接数5 - public JdbcAccount() { - } + /*public JdbcAccount() { + }*/ public JdbcAccount(String url, String user, String pwd) { this.url = url; @@ -45,6 +46,14 @@ public class JdbcAccount { this.pwd = pwd; } + public String getCate() { + return cate; + } + + public void setCate(String cate) { + this.cate = cate; + } + public Integer getConnectMax() { return connectMax; } diff --git a/src/main/java/net/tccn/dbq/jdbc/JdbcService.java b/src/main/java/net/tccn/dbq/jdbc/JdbcService.java index 6be6aab..44e45d3 100644 --- a/src/main/java/net/tccn/dbq/jdbc/JdbcService.java +++ b/src/main/java/net/tccn/dbq/jdbc/JdbcService.java @@ -1,13 +1,9 @@ package net.tccn.dbq.jdbc; +import net.tccn.dbq.table.Table; import org.redkale.util.Comment; -import java.sql.Connection; -import java.sql.DriverManager; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.ResultSetMetaData; -import java.sql.SQLException; +import java.sql.*; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -63,6 +59,9 @@ public class JdbcService { connection = DriverManager.getConnection(account.getUrl(), account.getUser(), account.getPwd()); jdbcPool.put(account, connection); } + + int i = 8000 * 12;//96000; + return connection; } @@ -145,7 +144,11 @@ public class JdbcService { System.out.println(connection); - String sql = "select * from basic_concat"; + + String sql = "select * from basic_concat limit 10"; + List list = JdbcService.findList(connection, sql); + System.out.println(list); + } } diff --git a/src/main/java/net/tccn/dbq/jdbc/JdbcSource.java b/src/main/java/net/tccn/dbq/jdbc/JdbcSource.java index fc35875..6d8a0ef 100644 --- a/src/main/java/net/tccn/dbq/jdbc/JdbcSource.java +++ b/src/main/java/net/tccn/dbq/jdbc/JdbcSource.java @@ -1,21 +1,9 @@ package net.tccn.dbq.jdbc; -import net.tccn.dbq.qtask.Qtask; - -import java.sql.Connection; -import java.sql.DriverManager; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.ResultSetMetaData; -import java.sql.SQLException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Queue; +import java.sql.*; +import java.util.*; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.LinkedBlockingDeque; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Function; @@ -26,7 +14,6 @@ import java.util.function.Function; public class JdbcSource { private JdbcAccount account; - private Queue queue = new LinkedBlockingDeque(); private static ConcurrentHashMap sources = new ConcurrentHashMap<>(); private List connections = new ArrayList<>(); private AtomicInteger connectNum = new AtomicInteger(); diff --git a/src/main/java/net/tccn/dbq/DbPlat.java b/src/main/java/net/tccn/dbq/jdbc/api/DbAccount.java similarity index 74% rename from src/main/java/net/tccn/dbq/DbPlat.java rename to src/main/java/net/tccn/dbq/jdbc/api/DbAccount.java index b3cfa60..9c1e342 100644 --- a/src/main/java/net/tccn/dbq/DbPlat.java +++ b/src/main/java/net/tccn/dbq/jdbc/api/DbAccount.java @@ -1,21 +1,19 @@ -package net.tccn.dbq; +package net.tccn.dbq.jdbc.api; import net.tccn.base.arango.Doc; -import net.tccn.dbq.jdbc.JdbcAccount; import org.redkale.convert.json.JsonConvert; import javax.persistence.Table; -import java.sql.Connection; -import java.sql.SQLException; import java.util.List; /** * 数据库平台 * @author: liangxianyou at 2018/11/14 12:58. */ +@SuppressWarnings("Duplicates") @Table(name = "db_plat", catalog = "db_dev") -public class DbPlat extends Doc { - public static DbPlat dao = dao(DbPlat.class); +public class DbAccount extends Doc { + public static DbAccount dao = dao(DbAccount.class); private String name; //名称 private String cate; //类型 mysql|ArangoDb @@ -25,7 +23,7 @@ public class DbPlat extends Doc { private String pwd; //密码 private List catalogs; //库 - private JdbcAccount jdbcAccount; + //private JdbcAccount jdbcAccount; //------------- setter/getter --------------- public String getName() { return name; @@ -89,10 +87,21 @@ public class DbPlat extends Doc { } //------------------------------------------------------------------------- - protected Connection connection() throws SQLException { + /*protected Connection connection() throws SQLException { if (jdbcAccount == null) { jdbcAccount = new JdbcAccount(url, user, pwd); } return jdbcAccount.getConnection(); + }*/ + + public String accountKey() { + int start = url.indexOf("//") + 2; + int end = url.indexOf("/", start); + int endDef = url.indexOf("?", end); + if (endDef == -1) { + endDef = url.length(); + } + String host = url.substring(start, end == -1 ? url.length() : end); + return user + "@" + host; } } diff --git a/src/main/java/net/tccn/dbq/jdbc/api/DbKit.java b/src/main/java/net/tccn/dbq/jdbc/api/DbKit.java new file mode 100644 index 0000000..196800a --- /dev/null +++ b/src/main/java/net/tccn/dbq/jdbc/api/DbKit.java @@ -0,0 +1,57 @@ +package net.tccn.dbq.jdbc.api; + +import java.util.List; + +/** + * Created by liangxianyou at 2019/3/12 14:11. + */ +public class DbKit implements DbSource{ + + private DbAccount dbAccount; + private DbSource dbSource; + + public DbKit(DbAccount dbAccount) { + this.dbAccount = dbAccount; + if ("mysql".equalsIgnoreCase(dbAccount.getCate())) { + dbSource = new DbSourceMysql(dbAccount); + } else { + throw new IllegalArgumentException(String.format("创建DbKit失败:数据库类型[cate:%s]未知", dbAccount.getCate())); + } + } + + + @Override + public List findList(String sql, Class type) { + return dbSource.findList(sql, type); + } + + @Override + public T findfirst(String sql, Class type) { + return dbSource.findfirst(sql, type); + } + + @Override + public T queryColumn(String sql, Class type) { + return dbSource.queryColumn(sql, type); + } + + @Override + public T queryInt(String sql) { + return null; + } + + @Override + public T queryLong(String sql) { + return null; + } + + @Override + public T queryDouble(String sql) { + return null; + } + + @Override + public T queryDate(String sql) { + return null; + } +} diff --git a/src/main/java/net/tccn/dbq/jdbc/api/DbSource.java b/src/main/java/net/tccn/dbq/jdbc/api/DbSource.java new file mode 100644 index 0000000..10c840b --- /dev/null +++ b/src/main/java/net/tccn/dbq/jdbc/api/DbSource.java @@ -0,0 +1,33 @@ +package net.tccn.dbq.jdbc.api; + +import java.util.Date; +import java.util.List; + +/** + * Created by liangxianyou at 2019/3/12 14:07. + */ +public interface DbSource { + + List findList(String sql, Class type); + + T findfirst(String sql, Class type); + + T queryColumn(String sql, Class type); + + default void save(String tableName, T t) {} + + default void update(String tableName, T t) {} + + default int queryInt(String sql) { + return queryColumn(sql, int.class); + } + default long queryLong(String sql) { + return queryColumn(sql, long.class); + } + default double queryDouble(String sql) { + return queryColumn(sql, double.class); + } + default Date queryDate(String sql) { + return queryColumn(sql, Date.class); + } +} diff --git a/src/main/java/net/tccn/dbq/jdbc/api/DbSourceMysql.java b/src/main/java/net/tccn/dbq/jdbc/api/DbSourceMysql.java new file mode 100644 index 0000000..eb610e5 --- /dev/null +++ b/src/main/java/net/tccn/dbq/jdbc/api/DbSourceMysql.java @@ -0,0 +1,167 @@ +package net.tccn.dbq.jdbc.api; + +import net.tccn.base.Kv; + +import java.sql.*; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.atomic.AtomicReferenceArray; + +/** + * Created by liangxianyou at 2019/3/12 14:20. + */ +@SuppressWarnings("Duplicates") +public class DbSourceMysql implements DbSource { + + private static ConcurrentHashMap> conns = new ConcurrentHashMap<>(); + private static ConcurrentHashMap counter = new ConcurrentHashMap<>(); + + private String accountKey; + private DbAccount dbAccount; + + public DbSourceMysql(DbAccount dbAccount) { + this.dbAccount = dbAccount; + this.accountKey = dbAccount.accountKey(); + } + + @Override + public List findList(String sql, Class type) { + Connection connection = connection(); + try ( + PreparedStatement ps = connection.prepareStatement(sql); + ResultSet rs = ps.executeQuery()) { + List list = new ArrayList(); + while (rs.next()) { + ResultSetMetaData metaData = rs.getMetaData(); + int count = metaData.getColumnCount(); + + Map row = new HashMap(); + for (int i = 1; i <= count; i++) { + String columnTypeName = metaData.getColumnTypeName(i); + String columnName = metaData.getColumnName(i); + row.put(columnName, null); + + if (rs.getObject(i) != null) { + switch (columnTypeName) { + case "DATETIME": + case "TIMESTAMP": + case "DATE": + row.put(columnName, rs.getTimestamp(i).getTime()); break; + default: + row.put(columnName, rs.getObject(i)); + } + } + } + list.add(Map.class == type ? row : Kv.toBean(row, type)); + } + + return list; + } catch (SQLException e) { + e.printStackTrace(); + return null; + } finally { + release(connection); + } + } + + @Override + public T findfirst(String sql, Class type) { + List list = findList(sql, type); + return list.size() > 0 ? list.get(0) : null; + } + + @Override + public T queryColumn(String sql, Class type) { + Connection connection = connection(); + try ( + PreparedStatement ps = connection.prepareStatement(sql); + ResultSet rs = ps.executeQuery() + ) { + Object v = null; + while (rs.next()) { + ResultSetMetaData metaData = rs.getMetaData(); + int count = metaData.getColumnCount(); + + for (int i = 1; i <= count; i++) { + String columnTypeName = metaData.getColumnTypeName(i); + if (rs.getObject(i) != null) { + switch (columnTypeName) { + case "DATETIME": + case "TIMESTAMP": + case "DATE": + v = rs.getTimestamp(i).getTime(); break; + default: + v = rs.getObject(i); + } + } + } + } + + return Kv.toAs(v, type); + } catch (SQLException e) { + e.printStackTrace(); + return null; + } finally { + release(connection); + } + } + + private Connection connection() { + return connection(0); + } + + private Connection connection(int n) { + AtomicReferenceArray arr = conns.getOrDefault(accountKey, new AtomicReferenceArray<>(15)); + Connection connection = null; + AtomicInteger num = counter.getOrDefault(accountKey, new AtomicInteger(0)); + for (int i = 0; num.get() > 0 && i < arr.length() && connection == null; i++) { + try { + connection = arr.getAndUpdate(i, null); + } catch (Exception e) { + System.out.println("getAndUpdate exception"); + } + } + if (connection == null) { + try { + if (num.get() < 15) { + connection = DriverManager.getConnection(dbAccount.getUrl(), dbAccount.getUser(), dbAccount.getPwd()); + num.getAndIncrement(); + } else { + //连接被全部使用中,等待1s后再次获取连接,直到得到连接 !!! + Thread.sleep(1000); + if (++n > 3) + connection(n); + } + } catch (SQLException e) { + e.printStackTrace(); + throw new IllegalArgumentException("获取数据库连接失败"); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + + return connection; + } + private void release(Connection connection) { + AtomicReferenceArray arr = conns.getOrDefault(accountKey, new AtomicReferenceArray<>(15)); + + int i = 0; + boolean bool = false; + while (i < arr.length() && !bool){ + bool = arr.compareAndSet(i++, null, connection); + } + + //如果没成功释放,关系连接 + if (!bool && connection != null) { + try { + connection.close(); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } +} diff --git a/src/main/java/net/tccn/dbq/jdbc/Column.java b/src/main/java/net/tccn/dbq/table/Column.java similarity index 97% rename from src/main/java/net/tccn/dbq/jdbc/Column.java rename to src/main/java/net/tccn/dbq/table/Column.java index c13b181..93e8bc3 100644 --- a/src/main/java/net/tccn/dbq/jdbc/Column.java +++ b/src/main/java/net/tccn/dbq/table/Column.java @@ -1,4 +1,4 @@ -package net.tccn.dbq.jdbc; +package net.tccn.dbq.table; /** * 数据库表的列 diff --git a/src/main/java/net/tccn/dbq/jdbc/Table.java b/src/main/java/net/tccn/dbq/table/Table.java similarity index 98% rename from src/main/java/net/tccn/dbq/jdbc/Table.java rename to src/main/java/net/tccn/dbq/table/Table.java index 628fc74..df1e689 100644 --- a/src/main/java/net/tccn/dbq/jdbc/Table.java +++ b/src/main/java/net/tccn/dbq/table/Table.java @@ -1,4 +1,4 @@ -package net.tccn.dbq.jdbc; +package net.tccn.dbq.table; import java.util.List; diff --git a/src/main/java/net/tccn/meta/MetaExecutor.java b/src/main/java/net/tccn/meta/MetaExecutor.java new file mode 100644 index 0000000..f5c6e39 --- /dev/null +++ b/src/main/java/net/tccn/meta/MetaExecutor.java @@ -0,0 +1,16 @@ +package net.tccn.meta; + +import net.tccn.base.JBean; +import net.tccn.qtask.QTask; + +/** + * Created by liangxianyou at 2019/3/7 16:13. + */ +public class MetaExecutor { + + public JBean execute(Task task) { + + return null; + } + +} diff --git a/src/main/java/net/tccn/meta/MetaKit.java b/src/main/java/net/tccn/meta/MetaKit.java index 9c4aabb..e0bb744 100644 --- a/src/main/java/net/tccn/meta/MetaKit.java +++ b/src/main/java/net/tccn/meta/MetaKit.java @@ -1,7 +1,7 @@ package net.tccn.meta; import net.tccn.base.Kv; -import net.tccn.dbq.DbPlat; +import net.tccn.dbq.jdbc.api.DbAccount; import net.tccn.dbq.Field; import net.tccn.dbq.fbean.FilterType; @@ -13,6 +13,7 @@ import java.util.Map; import java.util.Optional; import java.util.function.BiFunction; import java.util.function.Function; +import java.util.function.Predicate; import java.util.stream.Collectors; /** @@ -25,14 +26,14 @@ public class MetaKit { private static List metaLinks; private static List metaServices; - private static List dbPlats; + private static List dbPlats; static { metaTables = MetaTable.dao.find(); metaLinks = MetaLink.dao.find(); metaServices = MetaService.dao.find(); - dbPlats = DbPlat.dao.find(); + dbPlats = DbAccount.dao.find(); } //----- get/set ---- @@ -56,11 +57,11 @@ public class MetaKit { return metaServices; } - public static List getDbPlats() { + public static List getDbPlats() { return dbPlats; } - public static void setDbPlats(List dbPlats) { + public static void setDbPlats(List dbPlats) { MetaKit.dbPlats = dbPlats; } @@ -74,7 +75,7 @@ public class MetaKit { * @param alias * @return */ - private static MetaTable metaTableByAlias(String alias) { + public static MetaTable getMetaTableByAlias(String alias) { Optional table = metaTables.stream().filter(x -> x.getAlias().equals(alias)).findAny(); return table.orElse(null); } @@ -114,9 +115,9 @@ public class MetaKit { Optional service = metaServices.stream().filter(x -> x.getName().equals(name)).findAny(); //处理业务逻辑 service.ifPresent(x -> { - x.setMetaTable(metaTableByAlias(x.getTable())); - x.setMetaLinks(metaLinks(x.getLinks())); - x.setTables(metaTables(x.getMetaLinks())); + //x.setMetaTable(metaTableByAlias(x.getTable())); + //x.setMetaLinks(metaLinks(x.getLinks())); + //x.setTables(metaTables(x.getMetaLinks())); }); return service.orElse(null); } @@ -149,7 +150,7 @@ public class MetaKit { public static Function getField = (n) -> { String[] arr = n.split("[.]"); - MetaTable metaTable = metaTableByAlias(arr[0]); + MetaTable metaTable = getMetaTableByAlias(arr[0]); return metaTable.getItems().stream().filter(x -> x.getName().equals(arr[1])).findAny().orElse(null); }; @@ -229,8 +230,51 @@ public class MetaKit { return t; }; + //showUpdate + public static BiFunction, MetaService> showUpdate = (serviceKey, shows) -> { + + MetaService metaService = metaService(serviceKey); + + MetaService _metaService = MetaService.dao.findByKey(metaService.getKey()); + _metaService.setShows(shows); + _metaService.update(); + + metaService.setShows(shows);//更新缓存 + return metaService; + }; + public static MetaTable getMetaTableByKey(String key) { return metaTables.stream().filter(x -> x.getKey().equals(key)).findAny().orElse(null); - }; + } + + public static List getMetaLinks(String t, List shows, List filters) { + + + Predicate contain = s -> { + for (String item : shows) { + if (s.equals(item.split("[.]")[0])) { + return true; + } + } + for (String item : filters) { + if (s.equals(item.split("[.]")[0])) { + return true; + } + } + return false; + }; + + //得到直接关联 + //1、直接关联 表: t.equals(x.getTables()[0]) || t.equals(x.getTables()[1] + //2、关联且有过滤: + //3、关联有展示: + List links = metaLinks.stream() + .filter(x -> { + return (t.equals(x.getTables()[0]) || t.equals(x.getTables()[1])) + && (contain.test(x.getTables()[0]) || contain.test(x.getTables()[1])); + }) + .collect(Collectors.toList()); + return links; + } } diff --git a/src/main/java/net/tccn/meta/MetaParser.java b/src/main/java/net/tccn/meta/MetaParser.java new file mode 100644 index 0000000..d5b10ef --- /dev/null +++ b/src/main/java/net/tccn/meta/MetaParser.java @@ -0,0 +1,7 @@ +package net.tccn.meta; + +/** + * Created by liangxianyou at 2019/3/7 16:13. + */ +public class MetaParser { +} diff --git a/src/main/java/net/tccn/meta/MetaService.java b/src/main/java/net/tccn/meta/MetaService.java index fcc458d..b8e1ffe 100644 --- a/src/main/java/net/tccn/meta/MetaService.java +++ b/src/main/java/net/tccn/meta/MetaService.java @@ -16,7 +16,8 @@ public class MetaService extends Doc { private String name; //业务标识 private String table; //主体表别名 - private List links; //["link._key1","link._key2"] + private String comment; //业务中文名 + //private List links; //["link._key1","link._key2"] private List shows = new ArrayList<>(); @@ -24,9 +25,9 @@ public class MetaService extends Doc { private List filters = new ArrayList<>(); //待组装数据 - private MetaTable metaTable; - private List metaLinks;//[{alias:"b", table:"dept", link:[mk,lk]}, xxxx] - private Map tables; + //private MetaTable metaTable; + //private List metaLinks;//[{alias:"b", table:"dept", link:[mk,lk]}, xxxx] + //private Map tables; //------------------------------------------- public String getName() { @@ -45,13 +46,21 @@ public class MetaService extends Doc { this.table = table; } - public List getLinks() { + public String getComment() { + return comment; + } + + public void setComment(String comment) { + this.comment = comment; + } + + /*public List getLinks() { return links; } public void setLinks(List links) { this.links = links; - } + }*/ public List getShows() { return shows; @@ -77,27 +86,27 @@ public class MetaService extends Doc { this.filters = filters; } - public MetaTable getMetaTable() { + /*public MetaTable getMetaTable() { return metaTable; } public void setMetaTable(MetaTable metaTable) { this.metaTable = metaTable; - } + }*/ - public List getMetaLinks() { + /*public List getMetaLinks() { return metaLinks; } public void setMetaLinks(List metaLinks) { this.metaLinks = metaLinks; - } + }*/ - public Map getTables() { + /*public Map getTables() { return tables; } public void setTables(Map tables) { this.tables = tables; - } + }*/ } diff --git a/src/main/java/net/tccn/meta/Task.java b/src/main/java/net/tccn/meta/Task.java new file mode 100644 index 0000000..1cf83c7 --- /dev/null +++ b/src/main/java/net/tccn/meta/Task.java @@ -0,0 +1,7 @@ +package net.tccn.meta; + +/** + * Created by liangxianyou at 2019/3/7 16:24. + */ +public class Task { +} diff --git a/src/main/java/net/tccn/qtask/QRuner.java b/src/main/java/net/tccn/qtask/QRuner.java index 5b7be65..678412e 100644 --- a/src/main/java/net/tccn/qtask/QRuner.java +++ b/src/main/java/net/tccn/qtask/QRuner.java @@ -7,7 +7,7 @@ import net.tccn.qtask.impl.QTaskMysql; public class QRuner { - public static Object query(E e) { + public static Object query(Task e) { switch (e.cate.toLowerCase()) { case "mysql": return new QTaskMysql(e).execute(); diff --git a/src/main/java/net/tccn/qtask/QTask.java b/src/main/java/net/tccn/qtask/QTask.java index c80dc65..acdfa6f 100644 --- a/src/main/java/net/tccn/qtask/QTask.java +++ b/src/main/java/net/tccn/qtask/QTask.java @@ -1,7 +1,7 @@ package net.tccn.qtask; public interface QTask { - E getE(); + Task getE(); Object execute(); } diff --git a/src/main/java/net/tccn/qtask/E.java b/src/main/java/net/tccn/qtask/Task.java similarity index 80% rename from src/main/java/net/tccn/qtask/E.java rename to src/main/java/net/tccn/qtask/Task.java index b76baad..ff8eac7 100644 --- a/src/main/java/net/tccn/qtask/E.java +++ b/src/main/java/net/tccn/qtask/Task.java @@ -22,7 +22,7 @@ import net.tccn.base.Kv; * * */ -public class E { +public class Task { public String cate;//MYSQL,ES,METHOD,HTTP public String queryId; @@ -32,12 +32,21 @@ public class E { public String restType;//List, Map - public E(String cate, String queryId, String comment, Kv para) { + public Task() { + } + + public Task(String cate, String queryId, String comment, Kv para) { this.cate = cate; this.queryId = queryId; this.comment = comment; this.para = para; } + public void t() { + Task task = new Task(); + } + + + } diff --git a/src/main/java/net/tccn/qtask/impl/QTaskAbs.java b/src/main/java/net/tccn/qtask/impl/QTaskAbs.java index 3d0dafa..925334b 100644 --- a/src/main/java/net/tccn/qtask/impl/QTaskAbs.java +++ b/src/main/java/net/tccn/qtask/impl/QTaskAbs.java @@ -1,18 +1,18 @@ package net.tccn.qtask.impl; -import net.tccn.qtask.E; +import net.tccn.qtask.Task; import net.tccn.qtask.QTask; public abstract class QTaskAbs implements QTask { - private E e; + private Task e; - public QTaskAbs(E e) { + public QTaskAbs(Task e) { this.e = e; } @Override - public E getE() { + public Task getE() { return e; } } diff --git a/src/main/java/net/tccn/qtask/impl/QTaskEs.java b/src/main/java/net/tccn/qtask/impl/QTaskEs.java index 61d652f..28dfdef 100644 --- a/src/main/java/net/tccn/qtask/impl/QTaskEs.java +++ b/src/main/java/net/tccn/qtask/impl/QTaskEs.java @@ -1,12 +1,12 @@ package net.tccn.qtask.impl; -import net.tccn.qtask.E; +import net.tccn.qtask.Task; import net.tccn.qtask.QRuner; import net.tccn.base.Kv; public class QTaskEs extends QTaskAbs { - public QTaskEs(E e) { + public QTaskEs(Task e) { super(e); } @@ -19,6 +19,6 @@ public class QTaskEs extends QTaskAbs { }); String _url = url.toString().replaceAll(" ", "%20"); - return QRuner.query(new E("http", _url, "", Kv.of())); + return QRuner.query(new Task("http", _url, "", Kv.of())); } } diff --git a/src/main/java/net/tccn/qtask/impl/QTaskHttp.java b/src/main/java/net/tccn/qtask/impl/QTaskHttp.java index 4f85944..fd7cbd2 100644 --- a/src/main/java/net/tccn/qtask/impl/QTaskHttp.java +++ b/src/main/java/net/tccn/qtask/impl/QTaskHttp.java @@ -1,6 +1,6 @@ package net.tccn.qtask.impl; -import net.tccn.qtask.E; +import net.tccn.qtask.Task; import net.tccn.qtask.QTask; import java.io.*; @@ -13,7 +13,7 @@ import java.util.Map; */ public class QTaskHttp extends QTaskAbs implements QTask { - public QTaskHttp(E e) { + public QTaskHttp(Task e) { super(e); } diff --git a/src/main/java/net/tccn/qtask/impl/QTaskMethod.java b/src/main/java/net/tccn/qtask/impl/QTaskMethod.java index c5c74b7..ba154bb 100644 --- a/src/main/java/net/tccn/qtask/impl/QTaskMethod.java +++ b/src/main/java/net/tccn/qtask/impl/QTaskMethod.java @@ -1,6 +1,6 @@ package net.tccn.qtask.impl; -import net.tccn.qtask.E; +import net.tccn.qtask.Task; import net.tccn.base.Kv; import net.tccn.qtask.QTask; @@ -9,7 +9,7 @@ import java.lang.reflect.Method; public class QTaskMethod extends QTaskAbs implements QTask { - public QTaskMethod(E e) { + public QTaskMethod(Task e) { super(e); } diff --git a/src/main/java/net/tccn/qtask/impl/QTaskMysql.java b/src/main/java/net/tccn/qtask/impl/QTaskMysql.java index f2a358e..108fe29 100644 --- a/src/main/java/net/tccn/qtask/impl/QTaskMysql.java +++ b/src/main/java/net/tccn/qtask/impl/QTaskMysql.java @@ -1,13 +1,13 @@ package net.tccn.qtask.impl; -import net.tccn.qtask.E; +import net.tccn.qtask.Task; import net.tccn.qtask.QTask; public class QTaskMysql extends QTaskAbs implements QTask { private Object mapper; - public QTaskMysql(E e) { + public QTaskMysql(Task e) { super(e); } diff --git a/src/main/java/net/tccn/service/MetadataService.java b/src/main/java/net/tccn/service/MetadataService.java index 3b531c2..500dcc9 100644 --- a/src/main/java/net/tccn/service/MetadataService.java +++ b/src/main/java/net/tccn/service/MetadataService.java @@ -2,7 +2,7 @@ package net.tccn.service; import net.tccn.base.JBean; import net.tccn.base.Kv; -import net.tccn.dbq.DbPlat; +import net.tccn.dbq.jdbc.api.DbAccount; import net.tccn.dbq.Field; import net.tccn.dbq.qtask.SysPlat; import net.tccn.meta.MetaKit; @@ -58,7 +58,7 @@ public class MetadataService extends BaseService { //arango //----------- 数据平台 --------------- @RestMapping(name = "db_plat_list", comment = "数据平台") - public List dbPlatList() { + public List dbPlatList() { return MetaKit.getDbPlats(); } @@ -98,6 +98,17 @@ public class MetadataService extends BaseService { //arango return jBean.setBody(list); } + + @RestMapping(name = "service_list", comment = "业务列表") + public JBean serviceList(@RestParam(name = "platToken") String token) { + JBean jBean = new JBean(); + + List list = MetaKit.getMetaServices(); + jBean.setBody(list); + + return jBean; + } + @RestMapping(name = "tableinfo", comment = "table详情") public JBean tableInfo(@RestParam(name = "platToken") String token, String name) { return JBean.by(0, "", findMetaTable(name, token)); @@ -126,9 +137,8 @@ public class MetadataService extends BaseService { //arango public List showSort(String serviceKey , List items, @RestParam(name = "platToken") String token) { if (items == null || items.size() == 0) return null; - MetaTable metaTable = findMetaTable(serviceKey, token); - //fixme: metaTable.setShows(items); - metaTable.update(); + MetaKit.showUpdate.apply(serviceKey, items); + return items; } diff --git a/src/main/java/net/tccn/service/QtaskService.java b/src/main/java/net/tccn/service/QtaskService.java index c4dc378..bc2bed9 100644 --- a/src/main/java/net/tccn/service/QtaskService.java +++ b/src/main/java/net/tccn/service/QtaskService.java @@ -2,15 +2,13 @@ package net.tccn.service; import net.tccn.base.JBean; import net.tccn.base.Kv; -import net.tccn.base.arango.ArangoSource; -import net.tccn.dbq.DbPlat; +import net.tccn.dbq.jdbc.api.DbAccount; import net.tccn.dbq.qtask.Qtask; import net.tccn.dbq.qtask.SysPlat; import org.redkale.net.http.RestMapping; import org.redkale.net.http.RestParam; import org.redkale.net.http.RestService; -import javax.annotation.Resource; import java.sql.SQLException; import java.util.function.Predicate; @@ -71,7 +69,7 @@ public class QtaskService extends BaseService { jBean.set(-1, "查询失败,请设置正确的【数据平台】"); break; } - DbPlat dbPlat = DbPlat.dao.findByKey(qtask.getPlatId());//arangoSource.findById("db_plat/" + qTask.getPlatId(), DbPlat.class); + DbAccount dbPlat = DbAccount.dao.findByKey(qtask.getPlatId());//arangoSource.findById("db_plat/" + qTask.getPlatId(), DbAccount.class); if (dbPlat == null) { jBean.set(-1, "查询失败,请设置正确的【数据平台】"); break; } diff --git a/src/test/java/RunTest.java b/src/test/java/RunTest.java index 469ce02..7677a6d 100644 --- a/src/test/java/RunTest.java +++ b/src/test/java/RunTest.java @@ -1,18 +1,28 @@ -import net.tccn.qtask.E; -import net.tccn.qtask.QRuner; +import com.google.gson.Gson; import net.tccn.base.Kv; +import net.tccn.base.RealType; +import net.tccn.dbq.fbean.FBean; +import net.tccn.dbq.fbean.ParseMysql; +import net.tccn.dbq.jdbc.api.DbAccount; +import net.tccn.dbq.jdbc.api.DbKit; +import net.tccn.qtask.QRuner; +import net.tccn.qtask.Task; import org.junit.Test; +import java.util.Date; +import java.util.List; +import java.util.Map; + /** * @author: liangxianyou at 2019/1/20 12:43. */ public class RunTest { - public static E A = new E("mysql", "select * from user where userid=#(userid)", "查询用户列表", Kv.of("userid", 1)); - public static E B = new E("method", "User.say", "user调用", Kv.of("name", "张三").set("age", 13)); - public static E C = new E("http", "http://127.0.0.1/meta/db_plat_list?platToken=3421432", "查询数据平台列表", Kv.of("abx", "abx111")); - public static E d = new E("es", "http://192.168.91.5:9200/_sql?", "查询数据平台列表", Kv.of("sql", "select * from basic_iotdevice_all limit 10")); - public static E e = new E("http", "http://192.168.91.5:9200/_sql?sql=select%20*%20from%20basic_iotdevice_all%20limit%2010", "查询数据平台列表", Kv.of()); + public static Task A = new Task("mysql", "select * from user where userid=#(userid)", "查询用户列表", Kv.of("userid", 1)); + public static Task B = new Task("method", "User.say", "user调用", Kv.of("name", "张三").set("age", 13)); + public static Task C = new Task("http", "http://127.0.0.1/meta/db_plat_list?platToken=3421432", "查询数据平台列表", Kv.of("abx", "abx111")); + public static Task d = new Task("es", "http://192.168.91.5:9200/_sql?", "查询数据平台列表", Kv.of("sql", "select * from basic_iotdevice_all limit 10")); + public static Task e = new Task("http", "http://192.168.91.5:9200/_sql?sql=select%20*%20from%20basic_iotdevice_all%20limit%2010", "查询数据平台列表", Kv.of()); //@Test public void t() { @@ -26,4 +36,66 @@ public class RunTest { //System.out.println(query.getClass()); } + ParseMysql parser = new ParseMysql(); + @Test + public void t2() { + FBean fBean = new Gson().fromJson("{name:'user_service', filters:[{col:'a.username',type:'like',value:'lxy'}], orders:[{col:a.`id`,desc: -1},{col:a.`deptName`,desc: 1}], limit:{ps:2,pn:10}}", FBean.class); + + String[] parse = parser.parse(fBean); + + System.out.println("count:" + parse[0]); + System.out.println("list:" + parse[1]); + } + + @Test + public void jdbcTest() { + //DbAccount jdbcAccount = new DbAccount("jdbc:mysql://192.168.202.11:3306/gxbii_dev", "root", "eversec123098"); + DbAccount dbAccount = new DbAccount(); + dbAccount.setCate("mysql"); + dbAccount.setUrl("jdbc:mysql://192.168.202.11:3306/gxbii_dev"); + dbAccount.setUser("root"); + dbAccount.setPwd("eversec123098"); + + DbKit dbKit = new DbKit(dbAccount); + + // find list + List list = dbKit.findList("select * from basic_concat limit 1", Map.class); + System.out.println(list.get(0)); + + + //find count + /*long total = dbKit.queryColumn("select count(1) from basic_device", long.class); + System.out.println(total); + System.out.println(int.class);*/ + } + + @Test + public void toAsTest() { + Date date = Kv.toAs("2019-03-17 12:11:12", Date.class); + System.out.println(date); + System.out.println("--------------"); + Long aLong = Kv.toAs("34132213", Long.class); + System.out.println(aLong); + + System.out.println("--------------"); + Integer integer = Kv.toAs("34132213", Integer.class); + System.out.println(integer); + + System.out.println("--------------"); + Short aShort = Kv.toAs("121", short.class); + System.out.println(aShort); + + System.out.println("--------------"); + Double aDouble = Kv.toAs("4658132213", double.class); + System.out.println(aDouble); + + System.out.println("--------------"); + String s = Kv.toAs("4658132213", String.class); + System.out.println(s); + + System.out.println("--------------"); + Date date1 = Kv.toAs("Sun Mar 17 12:11:12 CST 2019", Date.class); + System.out.println(date1); + + } } diff --git a/src/test/java/User.java b/src/test/java/User.java index cbb2a2d..79090ce 100644 --- a/src/test/java/User.java +++ b/src/test/java/User.java @@ -6,6 +6,8 @@ import net.tccn.base.Kv; public class User { private int id; private String IP; + private String platContact; + private String idType; public int getId() { return id; @@ -23,10 +25,36 @@ public class User { this.IP = IP; } + public String getPlatContact() { + return platContact; + } + + public void setPlatContact(String platContact) { + this.platContact = platContact; + } + + public String getIdType() { + return idType; + } + + public void setIdType(String idType) { + this.idType = idType; + } + public String say(Kv kv) { String s = String.format("我叫:%s, 今年:%s岁", kv.get("name"), kv.get("age")); System.out.println(s); return s; } + + @Override + public String toString() { + return "User{" + + "id=" + id + + ", IP='" + IP + '\'' + + ", platContact='" + platContact + '\'' + + ", idType='" + idType + '\'' + + '}'; + } }