Commit c13a0618 authored by godkaikai's avatar godkaikai

metadata-mysql

parent 1343462e
...@@ -139,6 +139,7 @@ dlink -- 父项目 ...@@ -139,6 +139,7 @@ dlink -- 父项目
|-dlink-client -- Client 中心 |-dlink-client -- Client 中心
| |-dlink-client-1.12 -- Client-1.12 实现 | |-dlink-client-1.12 -- Client-1.12 实现
| |-dlink-client-1.13 -- Client-1.13 实现 | |-dlink-client-1.13 -- Client-1.13 实现
|-dlink-common -- 通用中心
|-dlink-connectors -- Connectors 中心 |-dlink-connectors -- Connectors 中心
| |-dlink-connector-jdbc -- Jdbc 扩展 | |-dlink-connector-jdbc -- Jdbc 扩展
|-dlink-core -- 执行中心 |-dlink-core -- 执行中心
...@@ -149,6 +150,9 @@ dlink -- 父项目 ...@@ -149,6 +150,9 @@ dlink -- 父项目
| |-doc -- 使用文档 | |-doc -- 使用文档
| |-sql -- sql脚本 | |-sql -- sql脚本
|-dlink-function -- 函数中心 |-dlink-function -- 函数中心
|-dlink-metadata -- 元数据中心
| |-dlink-metadata-base -- 元数据基础组件
| |-dlink-metadata-mysql -- 元数据- mysql 实现
|-dlink-web -- React 前端 |-dlink-web -- React 前端
``` ```
...@@ -163,7 +167,7 @@ npm run build ...@@ -163,7 +167,7 @@ npm run build
#### 后台编译打包 #### 后台编译打包
```shell ```shell
maven clean install -Dmaven.test.skip=true mvn clean install -Dmaven.test.skip=true
``` ```
#### 扩展Connector及UDF #### 扩展Connector及UDF
......
...@@ -8,7 +8,7 @@ import org.springframework.stereotype.Component; ...@@ -8,7 +8,7 @@ import org.springframework.stereotype.Component;
/** /**
* SpringContextUtils * SpringContextUtils
* *
* @author qiwenkai * @author wenmo
* @since 2021/6/29 15:36 * @since 2021/6/29 15:36
**/ **/
@Component @Component
......
...@@ -6,7 +6,7 @@ import lombok.Setter; ...@@ -6,7 +6,7 @@ import lombok.Setter;
/** /**
* StudioCADTO * StudioCADTO
* *
* @author qiwenkai * @author wenmo
* @since 2021/6/23 14:00 * @since 2021/6/23 14:00
**/ **/
@Getter @Getter
......
package com.dlink.assertion; package com.dlink.assertion;
import com.dlink.exception.RunTimeException;
/** /**
* Asserts * Asserts
* *
...@@ -20,6 +22,10 @@ public class Asserts { ...@@ -20,6 +22,10 @@ public class Asserts {
return isNull(str)||"".equals(str); return isNull(str)||"".equals(str);
} }
public static boolean isNotNullString(String str){
return !isNullString(str);
}
public static boolean isEquals(String str1,String str2){ public static boolean isEquals(String str1,String str2){
if(isNull(str1)&&isNull(str2)){ if(isNull(str1)&&isNull(str2)){
return true; return true;
...@@ -42,13 +48,19 @@ public class Asserts { ...@@ -42,13 +48,19 @@ public class Asserts {
public static void checkNull(String key,String msg) { public static void checkNull(String key,String msg) {
if (key == null||"".equals(key)) { if (key == null||"".equals(key)) {
throw new NullPointerException(msg); throw new RunTimeException(msg);
} }
} }
public static void checkNotNull(Object object,String msg) { public static void checkNotNull(Object object,String msg) {
if (isNull(object)) { if (isNull(object)) {
throw new NullPointerException(msg); throw new RunTimeException(msg);
}
}
public static void checkNullString(String key,String msg) {
if (isNull(key)||isEquals("",key)) {
throw new RunTimeException(msg);
} }
} }
......
...@@ -17,21 +17,17 @@ public class Column implements Serializable { ...@@ -17,21 +17,17 @@ public class Column implements Serializable {
private static final long serialVersionUID = 6438514547501611599L; private static final long serialVersionUID = 6438514547501611599L;
private boolean convert; private String name;
private String type;
private String comment;
private boolean keyFlag; private boolean keyFlag;
/** /**
* 主键是否为自增类型 * 主键是否为自增类型
*/ */
private boolean keyIdentityFlag; private boolean keyIdentityFlag;
private String name;
private String type;
private String propertyName;
private String columnType;
private String comment;
private String fill; private String fill;
private String isNotNull; private String isNotNull;
private boolean keyWords; private String javaType;
private String columnName;
private String columnFamily; private String columnFamily;
} }
\ No newline at end of file
...@@ -16,7 +16,6 @@ ...@@ -16,7 +16,6 @@
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target> <maven.compiler.target>1.8</maven.compiler.target>
<junit.version>4.12</junit.version>
</properties> </properties>
<dependencies> <dependencies>
...@@ -31,7 +30,6 @@ ...@@ -31,7 +30,6 @@
<dependency> <dependency>
<groupId>junit</groupId> <groupId>junit</groupId>
<artifactId>junit</artifactId> <artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>
<dependency> <dependency>
......
...@@ -9,7 +9,7 @@ import java.util.Set; ...@@ -9,7 +9,7 @@ import java.util.Set;
/** /**
* CABuilder * CABuilder
* *
* @author qiwenkai * @author wenmo
* @since 2021/6/23 11:03 * @since 2021/6/23 11:03
**/ **/
public class CABuilder { public class CABuilder {
......
...@@ -9,7 +9,7 @@ import java.util.List; ...@@ -9,7 +9,7 @@ import java.util.List;
/** /**
* ColumnCANode * ColumnCANode
* *
* @author qiwenkai * @author wenmo
* @since 2021/6/23 11:03 * @since 2021/6/23 11:03
**/ **/
@Getter @Getter
......
...@@ -9,7 +9,7 @@ import java.util.List; ...@@ -9,7 +9,7 @@ import java.util.List;
/** /**
* TableCANode * TableCANode
* *
* @author qiwenkai * @author wenmo
* @since 2021/6/23 11:03 * @since 2021/6/23 11:03
**/ **/
@Getter @Getter
......
...@@ -67,7 +67,7 @@ CREATE TABLE `dlink_task` ( ...@@ -67,7 +67,7 @@ CREATE TABLE `dlink_task` (
`check_point` int(11) NULL DEFAULT NULL COMMENT 'CheckPoint ', `check_point` int(11) NULL DEFAULT NULL COMMENT 'CheckPoint ',
`save_point_path` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 'SavePointPath', `save_point_path` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 'SavePointPath',
`parallelism` int(4) NULL DEFAULT NULL COMMENT 'parallelism', `parallelism` int(4) NULL DEFAULT NULL COMMENT 'parallelism',
`fragment` tinyint(255) NULL DEFAULT NULL COMMENT 'fragment', `fragment` tinyint(1) NULL DEFAULT NULL COMMENT 'fragment',
`cluster_id` int(11) NULL DEFAULT NULL COMMENT 'Flink集群ID', `cluster_id` int(11) NULL DEFAULT NULL COMMENT 'Flink集群ID',
`note` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '注释', `note` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '注释',
`enabled` tinyint(1) NOT NULL DEFAULT 1 COMMENT '是否启用', `enabled` tinyint(1) NOT NULL DEFAULT 1 COMMENT '是否启用',
...@@ -331,4 +331,29 @@ CREATE TABLE `dlink_history` ( ...@@ -331,4 +331,29 @@ CREATE TABLE `dlink_history` (
ALTER TABLE `dlink`.`dlink_task` ALTER TABLE `dlink`.`dlink_task`
ADD COLUMN `config` text NULL COMMENT '配置' AFTER `cluster_id`; ADD COLUMN `config` text NULL COMMENT '配置' AFTER `cluster_id`;
-- ----------------------------
-- Table structure for dlink_database
-- ----------------------------
DROP TABLE IF EXISTS `dlink_database`;
CREATE TABLE `dlink_database` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',
`name` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '数据源名',
`alias` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '数据源标题',
`group_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT 'Default' COMMENT '数据源分组',
`type` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '类型',
`driver_class_name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 'Driver',
`ip` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 'IP',
`port` int(11) NULL DEFAULT NULL COMMENT '端口号',
`url` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 'url',
`username` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用户名',
`password` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '密码',
`note` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '注释',
`db_version` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '版本,如oracle的11g,hbase的2.2.3',
`enabled` tinyint(1) NOT NULL DEFAULT 1 COMMENT '启用',
`create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
`update_time` datetime(0) NULL DEFAULT NULL COMMENT '最近修改时间',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `db_index`(`name`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
SET FOREIGN_KEY_CHECKS = 1; SET FOREIGN_KEY_CHECKS = 1;
package com.dlink.metadata.convert;
import com.dlink.metadata.rules.IColumnType;
import com.dlink.model.Column;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
* ITypeConvert
*
* @author wenmo
* @since 2021/7/20 14:39
**/
public interface ITypeConvert {
default IColumnType convert(Column column) {
return convert(column.getType());
}
default String convertToDB(Column column) {
return convertToDB(column.getJavaType());
}
IColumnType convert(String columnType);
String convertToDB(String columnType);
default Object convertValue(ResultSet results, String columnName, String javaType) throws SQLException {
switch (javaType.toLowerCase()) {
case "string":
return results.getString(columnName);
case "double":
return results.getDouble(columnName);
case "int":
return results.getInt(columnName);
case "float":
return results.getFloat(columnName);
case "decimal":
return results.getBigDecimal(columnName);
case "date":
case "localdate":
return results.getDate(columnName);
case "time":
case "localtime":
return results.getTime(columnName);
case "timestamp":
return results.getTimestamp(columnName);
case "blob":
return results.getBlob(columnName);
case "boolean":
return results.getBoolean(columnName);
case "byte":
return results.getByte(columnName);
case "bytes":
return results.getBytes(columnName);
default:
return results.getString(columnName);
}
}
}
package com.dlink.metadata; package com.dlink.metadata.driver;
import com.dlink.assertion.Asserts; import com.dlink.assertion.Asserts;
import com.dlink.metadata.result.SelectResult; import com.dlink.metadata.convert.ITypeConvert;
import com.dlink.model.Column; import com.dlink.metadata.query.IDBQuery;
import com.dlink.model.Schema; import com.dlink.model.Schema;
import com.dlink.model.Table; import com.dlink.model.Table;
import com.fasterxml.jackson.databind.JsonNode;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
...@@ -18,12 +15,16 @@ import java.util.stream.Collectors; ...@@ -18,12 +15,16 @@ import java.util.stream.Collectors;
* @author wenmo * @author wenmo
* @since 2021/7/19 23:32 * @since 2021/7/19 23:32
*/ */
public abstract class AbstractDriver implements Driver{ public abstract class AbstractDriver implements Driver {
public Logger logger = LoggerFactory.getLogger(this.getClass()); // public Logger logger = LoggerFactory.getLogger(this.getClass());
protected DriverConfig config; protected DriverConfig config;
public abstract IDBQuery getDBQuery();
public abstract ITypeConvert getTypeConvert();
public boolean canHandle(String type){ public boolean canHandle(String type){
return Asserts.isEqualsIgnoreCase(getType(),type); return Asserts.isEqualsIgnoreCase(getType(),type);
} }
...@@ -33,20 +34,6 @@ public abstract class AbstractDriver implements Driver{ ...@@ -33,20 +34,6 @@ public abstract class AbstractDriver implements Driver{
return this; return this;
} }
public abstract String getType();
public abstract boolean test();
public abstract Driver connect();
public abstract void close();
public abstract List<Schema> listSchemas();
public abstract List<Table> listTables(String schema);
public abstract List<Column> listColumns(String schema, String table);
public List<Schema> getSchemasAndTables(){ public List<Schema> getSchemasAndTables(){
return listSchemas().stream().peek(schema -> schema.setTables(listTables(schema.getName()))).sorted().collect(Collectors.toList()); return listSchemas().stream().peek(schema -> schema.setTables(listTables(schema.getName()))).sorted().collect(Collectors.toList());
} }
...@@ -55,22 +42,8 @@ public abstract class AbstractDriver implements Driver{ ...@@ -55,22 +42,8 @@ public abstract class AbstractDriver implements Driver{
return listTables(schema).stream().peek(table -> table.setColumns(listColumns(schema,table.getName()))).sorted().collect(Collectors.toList()); return listTables(schema).stream().peek(table -> table.setColumns(listColumns(schema,table.getName()))).sorted().collect(Collectors.toList());
} }
public abstract boolean existTable(Table table); @Override
public boolean existTable(Table table){
public abstract boolean createTable(Table table); return listTables(table.getSchema()).stream().anyMatch(tableItem -> Asserts.isEquals(tableItem.getName(),table.getName()));
}
public abstract String getCreateTableSql(Table table);
public abstract boolean deleteTable(Table table);
public abstract boolean truncateTable(Table table);
public abstract boolean insert(Table table, JsonNode data);
public abstract boolean update(Table table, JsonNode data);
public abstract boolean delete(Table table, JsonNode data);
public abstract SelectResult select(String sql);
} }
\ No newline at end of file
package com.dlink.metadata.driver;
import com.dlink.assertion.Asserts;
import com.dlink.model.Column;
import com.dlink.model.Schema;
import com.dlink.model.Table;
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.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
/**
* AbstractJdbcDriver
*
* @author wenmo
* @since 2021/7/20 14:09
**/
public abstract class AbstractJdbcDriver extends AbstractDriver {
protected Connection conn;
abstract String getDriverClass();
@Override
public boolean test() {
Asserts.checkNotNull(config,"无效的数据源配置");
try {
Class.forName(getDriverClass());
DriverManager.getConnection(config.getUrl(), config.getUsername(), config.getPassword()).close();
} catch (SQLException e) {
// logger.error("Jdbc链接测试失败!错误信息为:" + e.getMessage(), e);
return false;
} catch (Exception e) {
return false;
}
return true;
}
@Override
public Driver connect() {
try {
Class.forName(getDriverClass());
conn = DriverManager.getConnection(config.getUrl(), config.getUsername(), config.getPassword());
} catch (ClassNotFoundException | SQLException e) {
throw new RuntimeException(e);
}
return this;
}
@Override
public void close() {
try {
if(Asserts.isNotNull(conn)) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
@Override
public List<Schema> listSchemas(){
List<Schema> schemas = new ArrayList<>();
String schemasSql = getDBQuery().schemaAllSql();
try {
try (PreparedStatement preparedStatement = conn.prepareStatement(schemasSql);
ResultSet results = preparedStatement.executeQuery()) {
while (results.next()) {
String schemaName = results.getString(getDBQuery().schemaName());
if (Asserts.isNotNullString(schemaName)) {
Schema schema = new Schema(schemaName);
schemas.add(schema);
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
return schemas;
}
@Override
public List<Table> listTables(String schemaName) {
List<Table> tableList = new ArrayList<>();
ResultSet results = null;
try {
String tablesSql = getDBQuery().tablesSql();
StringBuilder sql = new StringBuilder(tablesSql);
try (PreparedStatement preparedStatement = conn.prepareStatement(sql.toString())) {
preparedStatement.setString(1,schemaName);
results = preparedStatement.executeQuery();
while (results.next()) {
String tableName = results.getString(getDBQuery().tableName());
if (Asserts.isNotNullString(tableName)) {
Table tableInfo = new Table();
tableInfo.setName(tableName);
String tableComment = results.getString(getDBQuery().tableComment());
tableInfo.setComment(tableComment);
tableInfo.setSchema(schemaName);
tableList.add(tableInfo);
}
}
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
if(Asserts.isNotNull(results)){
try {
results.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
return tableList;
}
@Override
public List<Column> listColumns(String schema, String tableName) {
List<Column> columns = new ArrayList<>();
try {
String tableFieldsSql = getDBQuery().columnsSql();
tableFieldsSql = String.format(tableFieldsSql, tableName);
try (
PreparedStatement preparedStatement = conn.prepareStatement(tableFieldsSql);
ResultSet results = preparedStatement.executeQuery()) {
while (results.next()) {
Column field = new Column();
String columnName = results.getString(getDBQuery().columnName());
boolean isId;
String key = results.getString(getDBQuery().columnKey());
isId = Asserts.isNotNullString(key) && "PRI".equals(key.toUpperCase());
if (isId) {
field.setKeyFlag(true);
} else {
field.setKeyFlag(false);
}
field.setName(columnName);
field.setType(results.getString(getDBQuery().columnType()));
field.setJavaType(getTypeConvert().convert(field.getType()).getType());
field.setComment(results.getString(getDBQuery().columnComment()));
field.setIsNotNull(results.getString(getDBQuery().isNotNull()));
columns.add(field);
}
}
} catch (SQLException e) {
e.printStackTrace();
}
return columns;
}
@Override
public boolean execute(String sql){
Asserts.checkNullString(sql,"Sql 语句为空");
String[] sqls = sql.split(";");
try(Statement statement = conn.createStatement()){
for (int i = 0; i < sqls.length; i++) {
if(Asserts.isNullString(sqls[i])){
continue;
}
statement.execute(sqls[i]);
}
return true;
} catch (SQLException e) {
e.printStackTrace();
}
return false;
}
@Override
public List<HashMap<String, Object>> query(String sql) {
List<HashMap<String, Object>> datas = new ArrayList<>();
List<Column> columns = new ArrayList<>();
try (PreparedStatement preparedStatement = conn.prepareStatement(sql);
ResultSet results = preparedStatement.executeQuery()) {
ResultSetMetaData metaData = results.getMetaData();
for (int i = 1; i <= metaData.getColumnCount(); i++) {
Column column = new Column();
column.setName(metaData.getColumnName(i));
column.setType(metaData.getColumnTypeName(i));
column.setJavaType(getTypeConvert().convert(metaData.getColumnTypeName(i)).getType());
columns.add(column);
}
while (results.next()) {
HashMap<String, Object> data = new HashMap<>();
for (int i = 0; i < columns.size(); i++) {
data.put(columns.get(i).getName(), getTypeConvert().convertValue(results,columns.get(i).getName(),columns.get(i).getType()));
}
datas.add(data);
}
results.close();
} catch (SQLException e) {
e.printStackTrace();
}
return datas;
}
}
package com.dlink.metadata; package com.dlink.metadata.driver;
import com.dlink.assertion.Asserts; import com.dlink.assertion.Asserts;
import com.dlink.exception.MetaDataException; import com.dlink.exception.MetaDataException;
...@@ -22,7 +22,7 @@ import java.util.Optional; ...@@ -22,7 +22,7 @@ import java.util.Optional;
public interface Driver { public interface Driver {
static Optional<Driver> get(DriverConfig config) { static Optional<Driver> get(DriverConfig config) {
Asserts.checkNotNull(config, "配置不能为空"); Asserts.checkNotNull(config, "数据源配置不能为空");
Iterator<Driver> providers = Service.providers(Driver.class); Iterator<Driver> providers = Service.providers(Driver.class);
while (providers.hasNext()) { while (providers.hasNext()) {
Driver gainer = providers.next(); Driver gainer = providers.next();
...@@ -47,6 +47,8 @@ public interface Driver { ...@@ -47,6 +47,8 @@ public interface Driver {
String getType(); String getType();
String getName();
boolean test(); boolean test();
Driver connect(); Driver connect();
...@@ -55,13 +57,13 @@ public interface Driver { ...@@ -55,13 +57,13 @@ public interface Driver {
List<Schema> listSchemas(); List<Schema> listSchemas();
List<Table> listTables(String schema); List<Table> listTables(String schemaName);
List<Column> listColumns(String schema, String table); List<Column> listColumns(String schemaName, String tableName);
List<Schema> getSchemasAndTables(); List<Schema> getSchemasAndTables();
List<Table> getTablesAndColumns(String schema); List<Table> getTablesAndColumns(String schemaName);
boolean existTable(Table table); boolean existTable(Table table);
...@@ -81,4 +83,8 @@ public interface Driver { ...@@ -81,4 +83,8 @@ public interface Driver {
SelectResult select(String sql); SelectResult select(String sql);
boolean execute(String sql);
List query(String sql);
} }
package com.dlink.metadata; package com.dlink.metadata.driver;
import lombok.Getter; import lombok.Getter;
...@@ -22,4 +22,5 @@ public class DriverConfig { ...@@ -22,4 +22,5 @@ public class DriverConfig {
private String username; private String username;
private String password; private String password;
} }
package com.dlink.metadata.query;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
* AbstractDBQuery
*
* @author wenmo
* @since 2021/7/20 13:50
**/
public abstract class AbstractDBQuery implements IDBQuery {
@Override
public boolean isKeyIdentity(ResultSet results) throws SQLException {
return false;
}
@Override
public String[] columnCustom() {
return null;
}
}
package com.dlink.metadata.query;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
* IDBQuery
*
* @author wenmo
* @since 2021/7/20 13:44
**/
public interface IDBQuery {
/**
* 所有数据库信息查询 SQL
*/
String schemaAllSql();
/**
* 所有表信息查询 SQL
*/
String tableAllSql();
/**
* 表信息查询 SQL
*/
String tablesSql();
/**
* 表字段信息查询 SQL
*/
String columnsSql();
/**
* 数据库、模式、组织名称
*/
String schemaName();
/**
* 表名称
*/
String tableName();
/**
* 表注释
*/
String tableComment();
/**
* 字段名称
*/
String columnName();
/**
* 字段类型
*/
String columnType();
/**
* 字段注释
*/
String columnComment();
/**
* 主键字段
*/
String columnKey();
/**
* 判断主键是否为identity,目前仅对mysql进行检查
*
* @param results ResultSet
* @return 主键是否为identity
* @throws SQLException ignore
*/
boolean isKeyIdentity(ResultSet results) throws SQLException;
/**
* 判断字段是否不为null,目前仅对mysql进行检查
*
* @return 主键是否不为bull
*/
String isNotNull();
/**
* 自定义字段名称
*/
String[] columnCustom();
}
package com.dlink.metadata.rules;
/**
* DbColumnType
*
* @author wenmo
* @since 2021/7/20 14:44
**/
public enum DbColumnType implements IColumnType {
// 基本类型
BASE_BYTE("byte", null),
BASE_SHORT("short", null),
BASE_CHAR("char", null),
BASE_INT("int", null),
BASE_LONG("long", null),
BASE_FLOAT("float", null),
BASE_DOUBLE("double", null),
BASE_BOOLEAN("boolean", null),
// 包装类型
BYTE("Byte", null),
SHORT("Short", null),
CHARACTER("Character", null),
INTEGER("Integer", null),
LONG("Long", null),
FLOAT("Float", null),
DOUBLE("Double", null),
BOOLEAN("Boolean", null),
STRING("String", null),
// sql 包下数据类型
DATE_SQL("Date", "java.sql.Date"),
TIME("Time", "java.sql.Time"),
TIMESTAMP("Timestamp", "java.sql.Timestamp"),
BLOB("Blob", "java.sql.Blob"),
CLOB("Clob", "java.sql.Clob"),
// java8 新时间类型
LOCAL_DATE("LocalDate", "java.time.LocalDate"),
LOCAL_TIME("LocalTime", "java.time.LocalTime"),
YEAR("Year", "java.time.Year"),
YEAR_MONTH("YearMonth", "java.time.YearMonth"),
LOCAL_DATE_TIME("LocalDateTime", "java.time.LocalDateTime"),
INSTANT("Instant", "java.time.Instant"),
// 其他杂类
BYTE_ARRAY("byte[]", null),
OBJECT("Object", null),
DATE("Date", "java.util.Date"),
BIG_INTEGER("BigInteger", "java.math.BigInteger"),
BIG_DECIMAL("BigDecimal", "java.math.BigDecimal");
/**
* 类型
*/
private final String type;
/**
* 包路径
*/
private final String pkg;
DbColumnType(final String type, final String pkg) {
this.type = type;
this.pkg = pkg;
}
@Override
public String getType() {
return type;
}
@Override
public String getPkg() {
return pkg;
}
}
package com.dlink.metadata.rules;
/**
* IColumnType
*
* @author wenmo
* @since 2021/7/20 14:43
**/
public interface IColumnType {
/**
* 获取字段类型
*/
String getType();
/**
* 获取字段类型完整名
*/
String getPkg();
}
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>dlink-metadata</artifactId>
<groupId>com.dlink</groupId>
<version>0.3.0-SANPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>dlink-metadata-mysql</artifactId>
<dependencies>
<dependency>
<groupId>com.dlink</groupId>
<artifactId>dlink-metadata-base</artifactId>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
</dependencies>
</project>
\ No newline at end of file
package com.dlink.metadata.convert;
import com.dlink.metadata.rules.DbColumnType;
import com.dlink.metadata.rules.IColumnType;
/**
* MySqlTypeConvert
*
* @author wenmo
* @since 2021/7/20 15:21
**/
public class MySqlTypeConvert implements ITypeConvert{
@Override
public IColumnType convert(String columnType) {
String t = columnType.toLowerCase();
if (t.contains("char")) {
return DbColumnType.STRING;
} else if (t.contains("bigint")) {
return DbColumnType.LONG;
} else if (t.contains("tinyint(1)")) {
return DbColumnType.BOOLEAN;
} else if (t.contains("int")) {
return DbColumnType.INTEGER;
} else if (t.contains("text")) {
return DbColumnType.STRING;
} else if (t.contains("bit")) {
return DbColumnType.BOOLEAN;
} else if (t.contains("decimal")) {
return DbColumnType.BIG_DECIMAL;
} else if (t.contains("clob")) {
return DbColumnType.CLOB;
} else if (t.contains("blob")) {
return DbColumnType.BLOB;
} else if (t.contains("binary")) {
return DbColumnType.BYTE_ARRAY;
} else if (t.contains("float")) {
return DbColumnType.FLOAT;
} else if (t.contains("double")) {
return DbColumnType.DOUBLE;
} else if (t.contains("json") || t.contains("enum")) {
return DbColumnType.STRING;
} else if (t.contains("date") || t.contains("time") || t.contains("year")) {
return DbColumnType.DATE;
}
return DbColumnType.STRING;
}
@Override
public String convertToDB(String columnType) {
switch (columnType.toLowerCase()){
case "string":
return "varchar(255)";
case "boolean":
return "tinyint(1)";
case "int":
case "integer":
return "int";
case "double":
return "double";
case "float":
return "float";
case "date":
return "datetime(0)";
default:
return "varchar(255)";
}
}
}
package com.dlink.metadata.driver;
import com.dlink.assertion.Asserts;
import com.dlink.metadata.convert.ITypeConvert;
import com.dlink.metadata.convert.MySqlTypeConvert;
import com.dlink.metadata.query.IDBQuery;
import com.dlink.metadata.query.MySqlQuery;
import com.dlink.metadata.result.SelectResult;
import com.dlink.model.Column;
import com.dlink.model.Table;
import com.fasterxml.jackson.databind.JsonNode;
import java.util.ArrayList;
import java.util.List;
/**
* MysqlDriver
*
* @author wenmo
* @since 2021/7/20 14:06
**/
public class MySqlDriver extends AbstractJdbcDriver {
@Override
public IDBQuery getDBQuery() {
return new MySqlQuery();
}
@Override
public ITypeConvert getTypeConvert() {
return new MySqlTypeConvert();
}
@Override
public String getType() {
return "Mysql";
}
@Override
public String getName() {
return "Mysql";
}
@Override
public String getDriverClass() {
return "com.mysql.cj.jdbc.Driver";
}
@Override
public boolean createTable(Table table) {
String sql = getCreateTableSql(table);
if(Asserts.isNotNull(sql)) {
return execute(sql.replaceAll("\r\n"," "));
}else{
return false;
}
}
@Override
public boolean deleteTable(Table table) {
return false;
}
@Override
public boolean truncateTable(Table table) {
return false;
}
@Override
public String getCreateTableSql(Table table) {
StringBuilder sb = new StringBuilder();
sb.append("CREATE TABLE `"+table.getName() + "` (");
List<Column> columns = table.getColumns();
for (int i = 0; i < columns.size(); i++) {
if(i>0){
sb.append(",");
}
sb.append("`"+columns.get(i).getName() + "` " + getTypeConvert().convertToDB(columns.get(i)));
if("YES".equals(columns.get(i).getIsNotNull())){
sb.append(" NOT NULL");
}else{
sb.append(" NULL");
}
if(Asserts.isNotNull(columns.get(i).getComment())){
sb.append(" COMMENT '"+columns.get(i).getComment()+"'");
}
}
List<String> pks = new ArrayList<>();
for (int i = 0; i < columns.size(); i++) {
if(columns.get(i).isKeyFlag()){
pks.add(columns.get(i).getName());
}
}
if(pks.size()>0){
sb.append(", PRIMARY KEY ( ");
for (int i = 0; i < pks.size(); i++) {
if(i>0){
sb.append(",");
}
sb.append("`"+pks.get(i)+"`");
}
sb.append(" ) USING BTREE");
}
sb.append(") ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '"+(table.getComment()!=null?table.getComment():"")+"' ROW_FORMAT = Dynamic;");
return sb.toString();
}
@Override
public boolean insert(Table table, JsonNode data) {
return false;
}
@Override
public boolean update(Table table, JsonNode data) {
return false;
}
@Override
public boolean delete(Table table, JsonNode data) {
return false;
}
@Override
public SelectResult select(String sql) {
return null;
}
}
package com.dlink.metadata.query;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
* MySqlQuery
*
* @author wenmo
* @since 2021/7/20 14:01
**/
public class MySqlQuery extends AbstractDBQuery {
@Override
public String schemaAllSql() {
return "show databases";
}
@Override
public String tableAllSql() {
return "select TABLE_NAME AS `NAME`,TABLE_SCHEMA AS `Database`,TABLE_COMMENT AS COMMENT from information_schema.tables";
}
@Override
public String tablesSql() {
return "select TABLE_NAME AS `NAME`,TABLE_SCHEMA AS `Database`,TABLE_COMMENT AS COMMENT from information_schema.tables" +
" where TABLE_SCHEMA = ?";
// return "show table status WHERE 1=1 ";
}
@Override
public String columnsSql() {
return "show full columns from `%s`";
}
@Override
public String schemaName() {
return "Database";
}
@Override
public String tableName() {
return "NAME";
}
@Override
public String tableComment() {
return "COMMENT";
}
@Override
public String columnName() {
return "FIELD";
}
@Override
public String columnType() {
return "TYPE";
}
@Override
public String columnComment() {
return "COMMENT";
}
@Override
public String columnKey() {
return "KEY";
}
@Override
public boolean isKeyIdentity(ResultSet results) throws SQLException {
return "auto_increment".equals(results.getString("Extra"));
}
@Override
public String isNotNull() {
return "NULL";
}
}
package com.dlink.metadata;
import com.dlink.metadata.driver.Driver;
import com.dlink.metadata.driver.DriverConfig;
import com.dlink.model.Column;
import com.dlink.model.Schema;
import org.junit.Test;
import java.util.List;
/**
* MysqlTest
*
* @author wenmo
* @since 2021/7/20 15:32
**/
public class MysqlTest {
public Driver getDriver(){
DriverConfig config = new DriverConfig();
config.setType("Mysql");
config.setIp("10.1.51.25");
config.setPort(3306);
config.setUsername("dca");
config.setPassword("dca");
config.setUrl("jdbc:mysql://10.1.51.25:3306/dca?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&autoReconnect=true");
return Driver.build(config).connect();
}
@Test
public void connectTest(){
DriverConfig config = new DriverConfig();
config.setType("Mysql");
config.setIp("10.1.51.25");
config.setPort(3306);
config.setUsername("dca");
config.setPassword("dca");
config.setUrl("jdbc:mysql://10.1.51.25:3306/dca?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&autoReconnect=true");
boolean test = Driver.build(config).test();
System.out.println(test);
System.out.println("end...");
}
@Test
public void schemaTest(){
Driver driver = getDriver();
List<Schema> schemasAndTables = driver.getSchemasAndTables();
System.out.println("end...");
}
@Test
public void columnTest(){
Driver driver = getDriver();
List<Column> columns = driver.listColumns("dca", "MENU");
System.out.println("end...");
}
@Test
public void queryTest(){
Driver driver = getDriver();
List query = driver.query("select * from MENU");
System.out.println("end...");
}
}
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
<packaging>pom</packaging> <packaging>pom</packaging>
<modules> <modules>
<module>dlink-metadata-base</module> <module>dlink-metadata-base</module>
<module>dlink-metadata-mysql</module>
</modules> </modules>
......
...@@ -42,6 +42,7 @@ ...@@ -42,6 +42,7 @@
<maven-jar-plugin.version>3.2.0</maven-jar-plugin.version> <maven-jar-plugin.version>3.2.0</maven-jar-plugin.version>
<maven-assembly-plugin.version>3.2.0</maven-assembly-plugin.version> <maven-assembly-plugin.version>3.2.0</maven-assembly-plugin.version>
<maven.resource.version>3.2.0</maven.resource.version> <maven.resource.version>3.2.0</maven.resource.version>
<junit.version>4.12</junit.version>
</properties> </properties>
<dependencyManagement> <dependencyManagement>
...@@ -127,6 +128,12 @@ ...@@ -127,6 +128,12 @@
<artifactId>hibernate-validator</artifactId> <artifactId>hibernate-validator</artifactId>
<version>${hibernate-validator.version}</version> <version>${hibernate-validator.version}</version>
</dependency> </dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>provided</scope>
</dependency>
<!-- flyway --> <!-- flyway -->
<dependency> <dependency>
<groupId>org.flywaydb</groupId> <groupId>org.flywaydb</groupId>
...@@ -158,6 +165,11 @@ ...@@ -158,6 +165,11 @@
<artifactId>dlink-common</artifactId> <artifactId>dlink-common</artifactId>
<version>${project.version}</version> <version>${project.version}</version>
</dependency> </dependency>
<dependency>
<groupId>com.dlink</groupId>
<artifactId>dlink-metadata-base</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies> </dependencies>
</dependencyManagement> </dependencyManagement>
<build> <build>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment