.
This commit is contained in:
98
src/main/java/net/tccn/dbq/DbPlat.java
Normal file
98
src/main/java/net/tccn/dbq/DbPlat.java
Normal 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();
|
||||
}
|
||||
}
|
||||
99
src/main/java/net/tccn/dbq/Field.java
Normal file
99
src/main/java/net/tccn/dbq/Field.java
Normal 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);
|
||||
}
|
||||
}
|
||||
8
src/main/java/net/tccn/dbq/fbean/DbType.java
Normal file
8
src/main/java/net/tccn/dbq/fbean/DbType.java
Normal file
@@ -0,0 +1,8 @@
|
||||
package net.tccn.dbq.fbean;
|
||||
|
||||
/**
|
||||
* Created by liangxianyou at 2018/12/14 15:34.
|
||||
*/ //数据库类型
|
||||
public enum DbType {
|
||||
MYSQL, ARANGODB
|
||||
}
|
||||
73
src/main/java/net/tccn/dbq/fbean/FBean.java
Normal file
73
src/main/java/net/tccn/dbq/fbean/FBean.java
Normal 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);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
89
src/main/java/net/tccn/dbq/fbean/Filter.java
Normal file
89
src/main/java/net/tccn/dbq/fbean/Filter.java
Normal 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;
|
||||
}
|
||||
}
|
||||
81
src/main/java/net/tccn/dbq/fbean/FilterType.java
Normal file
81
src/main/java/net/tccn/dbq/fbean/FilterType.java
Normal 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;
|
||||
}}
|
||||
44
src/main/java/net/tccn/dbq/fbean/Limit.java
Normal file
44
src/main/java/net/tccn/dbq/fbean/Limit.java
Normal 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;
|
||||
}
|
||||
}
|
||||
58
src/main/java/net/tccn/dbq/fbean/Order.java
Normal file
58
src/main/java/net/tccn/dbq/fbean/Order.java
Normal 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;
|
||||
}
|
||||
}
|
||||
29
src/main/java/net/tccn/dbq/fbean/ParseArango.java
Normal file
29
src/main/java/net/tccn/dbq/fbean/ParseArango.java
Normal 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 "";
|
||||
}
|
||||
}
|
||||
26
src/main/java/net/tccn/dbq/fbean/ParseEs.java
Normal file
26
src/main/java/net/tccn/dbq/fbean/ParseEs.java
Normal 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 "";
|
||||
}
|
||||
}
|
||||
118
src/main/java/net/tccn/dbq/fbean/ParseMysql.java
Normal file
118
src/main/java/net/tccn/dbq/fbean/ParseMysql.java
Normal 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());
|
||||
}
|
||||
}
|
||||
31
src/main/java/net/tccn/dbq/fbean/Parser.java
Normal file
31
src/main/java/net/tccn/dbq/fbean/Parser.java
Normal 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);
|
||||
|
||||
}
|
||||
55
src/main/java/net/tccn/dbq/jdbc/Column.java
Normal file
55
src/main/java/net/tccn/dbq/jdbc/Column.java
Normal 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;
|
||||
}
|
||||
|
||||
}
|
||||
72
src/main/java/net/tccn/dbq/jdbc/JdbcAccount.java
Normal file
72
src/main/java/net/tccn/dbq/jdbc/JdbcAccount.java
Normal 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;
|
||||
}
|
||||
}
|
||||
151
src/main/java/net/tccn/dbq/jdbc/JdbcService.java
Normal file
151
src/main/java/net/tccn/dbq/jdbc/JdbcService.java
Normal 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";
|
||||
|
||||
}
|
||||
}
|
||||
209
src/main/java/net/tccn/dbq/jdbc/JdbcSource.java
Normal file
209
src/main/java/net/tccn/dbq/jdbc/JdbcSource.java
Normal 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) {
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
72
src/main/java/net/tccn/dbq/jdbc/Table.java
Normal file
72
src/main/java/net/tccn/dbq/jdbc/Table.java
Normal 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();
|
||||
}
|
||||
//----------
|
||||
|
||||
}
|
||||
105
src/main/java/net/tccn/dbq/qtask/Qtask.java
Normal file
105
src/main/java/net/tccn/dbq/qtask/Qtask.java
Normal 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;
|
||||
}
|
||||
}
|
||||
39
src/main/java/net/tccn/dbq/qtask/SysPlat.java
Normal file
39
src/main/java/net/tccn/dbq/qtask/SysPlat.java
Normal 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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user