This commit is contained in:
2019-03-07 10:24:29 +08:00
parent 6c8c683c31
commit e057d613b9
215 changed files with 70917 additions and 118 deletions

View File

@@ -0,0 +1,98 @@
package net.tccn.dbq;
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.
*/
@Table(name = "db_plat", catalog = "db_dev")
public class DbPlat extends Doc<DbPlat> {
public static DbPlat dao = dao(DbPlat.class);
private String name; //名称
private String cate; //类型 mysql|ArangoDb
private String remark; //备注
private String url; //数据库连接地址
private String user; //账号
private String pwd; //密码
private List<String> catalogs; //库
private JdbcAccount jdbcAccount;
//------------- setter/getter ---------------
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCate() {
return cate;
}
public void setCate(String cate) {
this.cate = cate;
}
public String getRemark() {
return remark;
}
public void setRemark(String remark) {
this.remark = remark;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getUser() {
return user;
}
public void setUser(String user) {
this.user = user;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public List<String> getCatalogs() {
return catalogs;
}
public void setCatalogs(List<String> catalogs) {
this.catalogs = catalogs;
}
@Override
public String toString() {
return JsonConvert.root().convertTo(this);
}
//-------------------------------------------------------------------------
protected Connection connection() throws SQLException {
if (jdbcAccount == null) {
jdbcAccount = new JdbcAccount(url, user, pwd);
}
return jdbcAccount.getConnection();
}
}

View File

@@ -0,0 +1,99 @@
package net.tccn.dbq;
/**
* @author: liangxianyou at 2018/10/17 17:24.
*/
public class Field {
private String name;
private String label;
private String remark;
private String type;
private String inType;
private String inExt;
//============== getter/setter =============
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getLabel() {
return label;
}
public void setLabel(String label) {
this.label = label;
}
public String getRemark() {
return remark;
}
public void setRemark(String remark) {
this.remark = remark;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getInType() {
return inType;
}
public void setInType(String inType) {
this.inType = inType;
}
public String getInExt() {
return inExt;
}
public void setInExt(String inExt) {
this.inExt = inExt;
}
//------------------------------------
public enum InType {
SELECT_EXT("select_ext"),
INPUT_DT("input_dt");
String name;
InType(String name) {
this.name = name;
}
}
public enum QueryType {
}
public String showField() {
if (InType.SELECT_EXT.name.equalsIgnoreCase(inType)) {
return name + "|" + inExt;
} else if (InType.INPUT_DT.name.equalsIgnoreCase(inType)) {
return name + "=dt";
}
return name;
}
public boolean isDict() {
return InType.SELECT_EXT.name.equalsIgnoreCase(inType);
}
@Override
public boolean equals(Object name) {
return (this.name == null && name == null) || this.name.equals(name);
}
}

View File

@@ -0,0 +1,8 @@
package net.tccn.dbq.fbean;
/**
* Created by liangxianyou at 2018/12/14 15:34.
*/ //数据库类型
public enum DbType {
MYSQL, ARANGODB
}

View File

@@ -0,0 +1,73 @@
package net.tccn.dbq.fbean;
import java.util.List;
/**
* 查询用实体
* @author: liangxianyou at 2018/10/25 14:49.
*/
public class FBean {
private String name;
private List<Filter> filters;//[{f:xx, v: v, type:t}] -- t,
private List<Order> orders;//{f1: 1, f2: -1}
private Limit limit;//{pn: 1, ps: 10}
//---------- getter/setter ------------
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<Filter> getFilters() {
return filters;
}
public void setFilters(List<Filter> filters) {
this.filters = filters;
}
public List<Order> getOrders() {
return orders;
}
public void setOrders(List<Order> orders) {
this.orders = orders;
}
public Limit getLimit() {
return limit;
}
public void setLimit(Limit limit) {
this.limit = limit;
}
//-----------------------------------
//组装查询sql[list, count]
public String[] buildSqlFilter() {
//where 1=1 and x=1 and y=1 order by x,y limit 1,3;
String where = Filter.filter(filters);
String order = Order.order(orders, DbType.MYSQL);
if (limit == null) {
limit = new Limit();
}
String limit = this.limit.limit();
String list = where + order + limit;
String count = where;
return new String[]{list, count};
}
public void setLimit(int pn, int ps) {
limit.setPn(pn);
limit.setPs(ps);
}
}

View File

@@ -0,0 +1,89 @@
package net.tccn.dbq.fbean;
import java.util.List;
/**
* 查询条件实体
* Created by liangxianyou at 2018/12/14 15:34.
*/
public class Filter {
private String col;
private String value;
private String type;
public static Filter by(String col, Object value) {
return by(col, "==", value + "");//todo: == 不是mysql 语法,不具备通用性
}
public static Filter by(String col, String type, String value) {
Filter filter = new Filter();
filter.setCol(col);
filter.setType(type);
filter.setValue(value);
return filter;
}
//mysql 查询组装
public static String filter(List<Filter> filters) {
if (filters == null || filters.size() == 0) {
return "";
}
StringBuilder buf = new StringBuilder();
buf.append(" where 1=1");
filters.forEach(x -> {
buf.append(FilterType.buildSql(x));
});
return buf.toString();
}
public static String filter(List<Filter> filters, DbType dbType) {
if (DbType.MYSQL == dbType) {
return filter(filters);
} else if (DbType.ARANGODB == dbType) {
StringBuilder buf = new StringBuilder();
buf.append(" filter 1==1");
if (filters == null || filters.size() == 0) {
return "";
}
filters.forEach(x -> {
buf.append(" and d.").append(x.col).append(" " + (x.type == null ? "==" : x.type) + " ");
//处理数值型字段查询
if ("sysPlatId".equals(x.col) || "platId".equals(x.col) || "status".equals(x.col) || false) {
buf.append(x.value);
} else {
buf.append("'" + x.value + "'");
}
});
return buf.toString();
}
return "";
}
//---------- getter/setter ------------
public String getCol() {
return col;
}
public void setCol(String col) {
this.col = col;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
}

View File

@@ -0,0 +1,81 @@
package net.tccn.dbq.fbean;
import net.tccn.base.Kv;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* Created by liangxianyou at 2018/12/14 15:34.
*/
public enum FilterType {
EQUAL("=", "等于"),
NOTEQUAL("!=", "不等于"),
GREATERTHANOREQUALTO(">=", ">="),
LESSTHAN("<", "小于"),
LIKE("LIKE", "LIKE"),
IN("IN", "包含");
private String expre;
private String remark;
FilterType(String expre, String remark) {
this.expre = expre;
this.remark = remark;
}
//不同的条件构建过滤语句
public static String buildSql(Filter filter) {
if (filter.getValue() == null || filter.getValue().length() == 0) {
return "";
}
FilterType filterType = getFilterType(filter.getType());
if (filterType == null) {
return "";
}
String _sql;
switch (filterType) {
case IN:
_sql = String.format(" AND `%s` IN (%s)", filter.getCol(), filter.getValue());
break;
case LIKE:
_sql = String.format(" AND `%s` LIKE '%s'", filter.getCol(), "%" + filter.getValue() + "%");
break;
default:
_sql = String.format(" AND `%s` %s '%s'", filter.getCol(), filterType.expre, filter.getValue());
break;
}
return _sql;
}
public static FilterType getFilterType(String name) {
for (FilterType t : FilterType.values()) {
if (t.name().equalsIgnoreCase(name)) {
return t;
}
}
return null;
}
//获取所有的查询类型
public static List<Map> getAllTypes() {
List<Map> list = new ArrayList<>();
for (FilterType type : FilterType.values()) {
Kv kv = Kv.of("name", type.name())/*.set("expre", type.expre)*/.set("remark", type.remark);
list.add(kv);
}
return list;
}
public String getExpre() {
return expre;
}
public String getRemark() {
return remark;
}}

View File

@@ -0,0 +1,44 @@
package net.tccn.dbq.fbean;
/**
* Created by liangxianyou at 2018/12/14 15:36.
*/
public class Limit {
private int pn;
private int ps;
public Limit() {
}
public Limit(int pn, int ps) {
this.pn = pn;
this.ps = ps;
}
public String limit() {
if (pn < 1) {
pn = 1;
}
if (ps < 1) {
ps = 10;
}
return String.format(" LIMIT %s, %s", (pn - 1) * ps, ps);
}
//---- getter/setter -----
public int getPn() {
return pn;
}
public void setPn(int pn) {
this.pn = pn;
}
public int getPs() {
return ps;
}
public void setPs(int ps) {
this.ps = ps;
}
}

View File

@@ -0,0 +1,58 @@
package net.tccn.dbq.fbean;
import java.util.List;
/**
* Created by liangxianyou at 2018/12/14 15:36.
*/
public class Order {
private String col;
private int desc;//1 or -1
public Order() {
}
public Order(String col, int desc) {
this.col = col;
this.desc = desc;
}
public static String order(List<Order> orders, DbType dbType) {
if (orders == null || orders.size() == 0) {
return "";
}
StringBuilder buf = new StringBuilder();
switch (dbType) {
case MYSQL:
buf.append(" ORDER BY");
orders.forEach(x -> {
buf.append(String.format(" %s %s,", x.col, (x.desc == 1 ? "desc" : "asc")));
});
buf.deleteCharAt(buf.length() - 1);
break;
case ARANGODB:
// 待实现
break;
}
return buf.toString();
}
//--- getter/setter ---
public String getCol() {
return col;
}
public void setCol(String col) {
this.col = col;
}
public int getDesc() {
return desc;
}
public void setDesc(int desc) {
this.desc = desc;
}
}

View File

@@ -0,0 +1,29 @@
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 "";
}
}

View File

@@ -0,0 +1,26 @@
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 "";
}
}

View File

@@ -0,0 +1,118 @@
package net.tccn.dbq.fbean;
import net.tccn.meta.MetaKit;
import net.tccn.meta.MetaLink;
import net.tccn.meta.MetaService;
import net.tccn.meta.MetaTable;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.function.Predicate;
/**
* Created by liangxianyou at 2018/12/24 15:49.
*/
public class ParseMysql implements Parser {
private Predicate isEmpty = (x) -> {
if (x == null)
return true;
if (x instanceof List)
return ((List) x).isEmpty();
if (x instanceof String)
return ((String) x).isEmpty();
if (x instanceof Map)
return ((Map) x).isEmpty();
if (x instanceof Collection)
return ((Collection) x).isEmpty();
return false;
};
@Override
public String parse(FBean fBean) {
MetaService metaService = MetaKit.metaService(fBean.getName());
//基础属性
MetaTable metaTable = metaService.getMetaTable();//基础元数据
List<MetaLink> linkTables = metaService.getMetaLinks();//表关联条件
Map<String, MetaTable> attachTable = metaService.getTables();//用到的关联表
List<String> shows = metaService.getShows();//查询的属性
//查询条件
List<Filter> filters = fBean.getFilters();
Limit limit = fBean.getLimit();
List<Order> 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("*");
}
//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]);
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);
});
});
}
//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();
}
@Override
public String parse(Filter filter) {
return null;
}
@Override
public String parseSave(MetaService ms, Map data) {
String sqlTpl = "insert %s (%s) value (%s)";
StringBuilder bufK = new StringBuilder();
StringBuilder bufV = new StringBuilder();
data.forEach((k,v) -> {
if (v != null || !String.valueOf(v).isEmpty()) {
bufK.append("`").append(k).append("`,");
if (v instanceof Number) {
bufV.append(v).append(",");
} else {
bufV.append("'").append(v).append("',");
}
}
});
bufK.deleteCharAt(bufK.length() - 1);
bufV.deleteCharAt(bufV.length() - 1);
return String.format(sqlTpl, ms.getMetaTable().getName(), bufK.toString(), bufV.toString());
}
}

View File

@@ -0,0 +1,31 @@
package net.tccn.dbq.fbean;
import net.tccn.meta.MetaService;
import java.util.Map;
/**
* Created by liangxianyou at 2018/12/24 15:47.
*/
public interface Parser {
/**
* 组装完整的查询条件
* @param fBean
*/
String parse(FBean fBean);
/**
* 解析一个查询条件
* @param filter
*/
String parse(Filter filter);
/**
* 解析入库语句
* @param data
* @return
*/
String parseSave(MetaService ms, Map data);
}

View File

@@ -0,0 +1,55 @@
package net.tccn.dbq.jdbc;
/**
* 数据库表的列
* @author: liangxianyou at 2018/10/8 10:59.
*/
public class Column {
private String name; //列名称
private String type; //列类型
private boolean notNull; //不为null
private String comment; //列说明
public Column() {
}
public Column(String name, String type, boolean notNull, String comment) {
this.name = name;
this.type = type;
this.notNull = notNull;
this.comment = comment;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public boolean getNotNull() {
return notNull;
}
public void setNotNull(boolean notNull) {
this.notNull = notNull;
}
public String getComment() {
return comment;
}
public void setComment(String comment) {
this.comment = comment;
}
}

View File

@@ -0,0 +1,72 @@
package net.tccn.dbq.jdbc;
import java.sql.Connection;
/**
* @author: liangxianyou at 2018/10/11 17:47.
*/
public class JdbcAccount {
private String url;
private String user;
private String pwd;
private Integer connectMax = 5;//默认最大连接数5
public JdbcAccount() {
}
public JdbcAccount(String url, String user, String pwd) {
this.url = url;
this.user = user;
this.pwd = pwd;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getUser() {
return user;
}
public void setUser(String user) {
this.user = user;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public Integer getConnectMax() {
return connectMax;
}
public void setConnectMax(Integer connectMax) {
this.connectMax = connectMax;
}
//-------------------------------------------------------
public String parse() {
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;
}
public Connection getConnection() {
return null;
}
}

View File

@@ -0,0 +1,151 @@
package net.tccn.dbq.jdbc;
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.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.BiFunction;
/**
* JdbcService.
*
* @author: liangxianyou at 2018/10/8 10:39.
*/
public class JdbcService {
private JdbcAccount account;
private static ConcurrentHashMap<JdbcAccount, Connection> jdbcPool = new ConcurrentHashMap<>();
public JdbcService(JdbcAccount account) {
this.account = account;
}
//-------------- query -----------------
private <R> List<R> executeQuery(String sql, Map columns, BiFunction<ResultSet, Map, R> fun) throws SQLException {
try (
Connection connection = DriverManager.getConnection(account.getUrl(), account.getUser(), account.getPwd());
PreparedStatement ps = connection.prepareStatement(sql);
ResultSet resultSet = ps.executeQuery()) {
List list = new ArrayList();
while (resultSet.next()) {
list.add(fun.apply(resultSet, columns));
}
return list;
}
}
public static List<String> getCatalogs(Connection connection) throws SQLException {
List<String> catalogs = new ArrayList<>();
try (
PreparedStatement ps = connection.prepareStatement("show databases;");
ResultSet rs = ps.executeQuery()
) {
while (rs.next()) {
catalogs.add(rs.getString(1));
}
}
return catalogs;
}
public static Connection getConnection(JdbcAccount account) throws SQLException {
Connection connection = jdbcPool.get(account);
if (connection == null) {
connection = DriverManager.getConnection(account.getUrl(), account.getUser(), account.getPwd());
jdbcPool.put(account, connection);
}
return connection;
}
@Comment("列表数据查询")
public static List<Map> findList(Connection connection, String sql) throws SQLException {
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(row);
}
return list;
}
}
@Comment("统计总数")
public static int findNumber(Connection connection, String sql) throws SQLException {
try (
PreparedStatement ps = connection.prepareStatement(sql);
ResultSet rs = ps.executeQuery()) {
rs.next();
return rs.getInt(1);
}
}
public static int update(Connection connection, String sql) throws SQLException {
try (
PreparedStatement ps = connection.prepareStatement(sql);
){
return ps.executeUpdate();
}
}
// ---------------- DDL ---------------------
public static boolean createTable(Connection connection, Table table) throws SQLException {
if (table.getCatalog() != null && table.getCatalog().length() > 0) {
connection.setCatalog(table.getCatalog());
}
String tableDdl = table.getTableDdl();
System.out.println(tableDdl);
try (PreparedStatement ps = connection.prepareStatement(tableDdl)) {
return ps.execute();
}
}
public static void main(String[] args) throws SQLException {
String url = "jdbc:mysql://192.168.202.11:3306/gxbii_dev";
String user = "root";
String pwd = "eversec123098";
JdbcAccount account = new JdbcAccount(url, user, pwd);
Connection connection = account.getConnection();
System.out.println(connection);
String sql = "select * from basic_concat";
}
}

View File

@@ -0,0 +1,209 @@
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.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;
/**
* Created by liangxianyou at 2018/12/21 17:42.
*/
public class JdbcSource {
private JdbcAccount account;
private Queue<Qtask> queue = new LinkedBlockingDeque();
private static ConcurrentHashMap<String, JdbcSource> sources = new ConcurrentHashMap<>();
private List<Connection> connections = new ArrayList<>();
private AtomicInteger connectNum = new AtomicInteger();
private JdbcSource() {
}
public JdbcSource(JdbcAccount account) {
String key = account.parse();
synchronized (sources) {
JdbcSource source = sources.get(key);
if (source == null) {
source = new JdbcSource();
}
source.account = account;
do {
try {
Connection connection = DriverManager.getConnection(account.getUrl(), account.getUser(), account.getPwd());
connections.add(connection);
} catch (SQLException e) {
e.printStackTrace();
break;
}
} while (connectNum.incrementAndGet() < 2);//默认初始化连接数 2
}
}
/**
* 获取连接
* @return
*/
private Connection getConnection() {
synchronized (connections) {
//有闲置连接,直接返回
if (connections.size() > 0) {
return connections.remove(0);
}
//没有闲置连接,总连接数小于最大连接数,创建新连接
if (connectNum.get() < account.getConnectMax()) {
try {
return DriverManager.getConnection(account.getUrl(), account.getUser(), account.getPwd());
} catch (SQLException e) {
e.printStackTrace();
}
}
//已达最大连接,且没有闲置,等待
}
return null;
}
/**
* 释放连接
* @param connection
*/
private void releaseConnection(Connection connection) {
connections.add(connection);
}
/**
* 通过Account 获取连接
* 同一个连接对象同一时刻只能被一个线程所使用,
* 两种方案:
* 1、多个连接对象每次线程得到对应的连接用完返还连接
* 2、一到多个连接每次数据库操作交给执行队列执行并返回执行结果
* @param account
* @return
*/
/*public Connection getConnection(JdbcAccount account) {
String key = account.parse();
List<Connection> conns = sources.get(key);
if (conns == null) {
conns = new ArrayList<>();
}
if (conns.size() == 0) {
try {
Connection connection = DriverManager.getConnection(account.getUrl(), account.getUser(), account.getPwd());
} catch (SQLException e) {
e.printStackTrace();
}
}
return null;
}*/
private Function<ResultSet, Map> dataToMap = (rs) -> {
Map row = new HashMap();
try {
ResultSetMetaData metaData = rs.getMetaData();
int count = metaData.getColumnCount();
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));
}
}
}
} catch (SQLException e) {
e.printStackTrace();
}
return row;
};
private Function<ResultSet, List<Map>> dataToList = (rs) -> {
List list = new ArrayList<>();
try {
while (rs.next()) {
list.add(dataToMap.apply(rs));
}
} catch (SQLException e) {
e.printStackTrace();
}
return list;
};
/**
* 通过sql查询 数据,
* 将每次查询任务加入到查询队列
* @param sql
* @return
*/
private Queue<String> finds = new LinkedBlockingQueue<>();
public CompletableFuture<List<Map>> find(String sql) {
return CompletableFuture.supplyAsync(() -> {
List<Map> list = null;
Connection connection = getConnection();
try (
PreparedStatement ps = connection.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
) {
list = dataToList.apply(rs);
} catch (SQLException e) {
e.printStackTrace();
}
releaseConnection(connection);
return list;
});
/*
Connection connection = getConnection(null);
try (
PreparedStatement ps = connection.prepareStatement(sql);
) {
} catch (SQLException e) {
e.printStackTrace();
}
return null;
*/
}
private void find(String sql, int cate) {
}
}

View File

@@ -0,0 +1,72 @@
package net.tccn.dbq.jdbc;
import java.util.List;
/**
* 数据库表.
* @author: liangxianyou at 2018/10/8 10:58.
*/
public class Table {
private String catalog; //库名称
private String name; //表名称
private String comment; //表备注
private List<Column> columns; //表的字段列
public Table(String name, String comment) {
this.name = name;
this.comment = comment;
}
//------------ getter/setter -------------
public String getCatalog() {
return catalog;
}
public void setCatalog(String catalog) {
this.catalog = catalog;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getComment() {
return comment;
}
public void setComment(String comment) {
this.comment = comment;
}
public List<Column> getColumns() {
return columns;
}
public void setColumns(List<Column> columns) {
this.columns = columns;
}
//------------------------------
//Dev
public String getTableDdl() {
StringBuilder buf = new StringBuilder();
buf.append("CREATE TABLE " + name + "(");
columns.forEach(x -> {
buf.append("\n " + x.getName() + " " + x.getType() + ",");
});
buf.deleteCharAt(buf.length() - 1);
buf.append("\n) COMMENT '" + comment + "';");
return buf.toString();
}
//----------
}

View File

@@ -0,0 +1,105 @@
package net.tccn.dbq.qtask;
import net.tccn.base.arango.Doc;
import javax.persistence.Table;
/**
* @author: liangxianyou at 2018/11/13 14:59.
*/
@Table(name = "qtask", catalog = "db_dev")
public class Qtask extends Doc<Qtask> {
public static Qtask dao = dao(Qtask.class);
private String queryId; //查询id
private String name; //业务名称
private String remark; //说明
private String sql; //SQL
private String para; //默认查询参数
private String cate; //任务类型 find|update
private Integer sysPlatId; //数据平台id
private Integer platId; //数据平台id
private String catalog; //数据库名
private Integer status; //状态 1启用|0未启用|-1删除
//------------- setter/getter ------------------------
public String getQueryId() {
return queryId;
}
public void setQueryId(String queryId) {
this.queryId = queryId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getRemark() {
return remark;
}
public void setRemark(String remark) {
this.remark = remark;
}
public String getSql() {
return sql;
}
public void setSql(String sql) {
this.sql = sql;
}
public String getPara() {
return para;
}
public void setPara(String para) {
this.para = para;
}
public String getCate() {
return cate;
}
public void setCate(String cate) {
this.cate = cate;
}
public Integer getSysPlatId() {
return sysPlatId;
}
public void setSysPlatId(Integer sysPlatId) {
this.sysPlatId = sysPlatId;
}
public Integer getPlatId() {
return platId;
}
public void setPlatId(Integer platId) {
this.platId = platId;
}
public String getCatalog() {
return catalog;
}
public void setCatalog(String catalog) {
this.catalog = catalog;
}
public Integer getStatus() {
return status;
}
public void setStatus(Integer status) {
this.status = status;
}
}

View File

@@ -0,0 +1,39 @@
package net.tccn.dbq.qtask;
import net.tccn.base.arango.Doc;
import javax.persistence.Table;
/**
* @author: liangxianyou at 2018/11/26 17:46.
*/
@Table(name = "sys_plat", catalog = "db_dev")
public class SysPlat extends Doc<SysPlat> {
public static SysPlat dao = dao(SysPlat.class);
private String name;
private String token;
public SysPlat() {
}
public SysPlat(String token) {
this.token = token;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getToken() {
return token;
}
public void setToken(String token) {
this.token = token;
}
}