Commit 4b8e8be0 authored by lcg's avatar lcg

doris&&sqlServer

parent 46771a3f
<?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.6.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>dlink-metadata-doris</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<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>
<scope>test</scope>
</dependency>
</dependencies>
</project>
\ No newline at end of file
package com.dlink.metadata.constant;
public interface DorisConstant {
/**
* 查询所有database
*/
String QUERY_ALL_DATABASE = " show databases ";
/**
* 查询所有schema下的所有表
*/
String QUERY_TABLE_BY_SCHEMA = " select TABLE_NAME AS `NAME`,TABLE_SCHEMA AS `SCHEMA`,TABLE_COMMENT AS COMMENT, '' as TYPE, '' as CATALOG, '' as ENGINE , '' as OPTIONS , 0 as `ROWS`, null as CREATE_TIME, null as UPDATE_TIME from information_schema.tables where TABLE_SCHEMA = '%s' ";
/**
* 查询指定schema.table下的所有列信息
*/
String QUERY_COLUMNS_BY_TABLE_AND_SCHEMA = " show full columns from `%s`.`%s` ";
}
package com.dlink.metadata.convert;
import com.dlink.metadata.rules.DbColumnType;
import com.dlink.metadata.rules.IColumnType;
public class DorisTypeConvert 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.DorisTypeConvert;
import com.dlink.metadata.convert.ITypeConvert;
import com.dlink.metadata.query.DorisQuery;
import com.dlink.metadata.query.IDBQuery;
import com.dlink.model.Column;
import com.dlink.model.Table;
import java.util.ArrayList;
import java.util.List;
public class DorisDriver extends AbstractJdbcDriver{
@Override
public IDBQuery getDBQuery() {
return new DorisQuery();
}
@Override
public ITypeConvert getTypeConvert() {
return new DorisTypeConvert();
}
@Override
String getDriverClass() {
return "com.mysql.cj.jdbc.Driver";
}
@Override
public String getType() {
return "Doris";
}
@Override
public String getName() {
return "Doris";
}
@Override
public String getCreateTableSql(Table table) {
StringBuilder sb = new StringBuilder();
sb.append("CREATE TABLE " + table.getSchema() + "." + 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).isNullable())) {
sb.append(" NOT NULL ");
} else {
sb.append(" NULL ");
}
if (Asserts.isNotNullString(columns.get(i).getComment())) {
sb.append(" COMMENT '" + columns.get(i).getComment() + "' ");
}
}
sb.append(" ) ENGINE = olap ");
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("UNIQUE KEY( ");
for (int i = 0; i < pks.size(); i++) {
if (i > 0) {
sb.append(",");
}
sb.append(pks.get(i));
}
sb.append(") ");
}
if(Asserts.isNotNullString(table.getComment())){
sb.append("COMMENT '" + table.getComment() + "' ");
}
sb.append("DISTRIBUTED BY HASH(" + pks.get(0) + ") BUCKETS 32 ");
sb.append("PROPERTIES('replication_num' = '1')");
return sb.toString();
}
}
package com.dlink.metadata.query;
import com.dlink.metadata.constant.DorisConstant;
import java.sql.ResultSet;
import java.sql.SQLException;
public class DorisQuery extends AbstractDBQuery{
@Override
public String schemaAllSql() {
return DorisConstant.QUERY_ALL_DATABASE;
}
@Override
public String tablesSql(String schemaName) {
return String.format(DorisConstant.QUERY_TABLE_BY_SCHEMA, schemaName);
}
@Override
public String columnsSql(String schemaName, String tableName) {
return String.format(DorisConstant.QUERY_COLUMNS_BY_TABLE_AND_SCHEMA, schemaName, tableName);
}
@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";
}
public boolean isKeyIdentity(ResultSet results) throws SQLException {
return "auto_increment".equals(results.getString("Extra"));
}
@Override
public String isNullable() {
return "Null";
}
@Override
public String characterSet() {
return "Default";
}
@Override
public String collation() {
return "Default";
}
@Override
public String columnPosition() {
return "Default";
}
@Override
public String precision() {
return "Default";
}
@Override
public String scale() {
return "Default";
}
@Override
public String autoIncrement() {
return "Default";
}
}
package com.dlink.metadata;
import com.dlink.metadata.driver.Driver;
import com.dlink.metadata.driver.DriverConfig;
import com.dlink.metadata.result.JdbcSelectResult;
import com.dlink.model.Column;
import com.dlink.model.Schema;
import com.dlink.model.Table;
import org.junit.Before;
import org.junit.Test;
import java.sql.SQLException;
import java.util.LinkedHashMap;
import java.util.List;
public class DorisTest {
private Driver driver;
@Before
public void init(){
DriverConfig config = new DriverConfig();
config.setType("Doris");
config.setIp("10.1.51.26");
config.setPort(9030);
config.setUsername("root");
config.setPassword("dw123456");
config.setUrl("jdbc:mysql://10.1.51.26:9030/test");
try {
driver = Driver.build(config).connect();
}catch (Exception e){
System.err.println("连接创建失败");
e.printStackTrace();
}
}
@Test
public void test() throws SQLException {
//test
String test = driver.test();
System.out.println(test);
System.out.println("schema && table -----");
testSchema();
System.out.println("columns -----");
testColumns();
System.out.println("query -----");
query();
}
@Test
public void testSchema(){
//schema && table
List<Schema> schemasAndTables = driver.getSchemasAndTables();
for (Schema schemasAndTable : schemasAndTables) {
List<Table> tables = schemasAndTable.getTables();
for (Table table : tables) {
System.out.println(table.getName() + " " + table.getSchema());
}
}
}
@Test
public void testColumns(){
// columns
List<Column> columns = driver.listColumns("test", "scoreinfo");
for (Column column : columns) {
System.out.println(column.getName() + " " + column.getType() + column.getComment() );
}
}
@Test
public void query(){
JdbcSelectResult selectResult = driver.query("select * from scoreinfo ", 10);
List<LinkedHashMap<String, Object>> rowData = selectResult.getRowData();
for (LinkedHashMap<String, Object> rowDatum : rowData) {
System.out.println(rowData);
}
}
}
<?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.6.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>dlink-metadata-sqlserver</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<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>com.microsoft.sqlserver</groupId>
<artifactId>mssql-jdbc</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>
\ No newline at end of file
package com.dlink.metadata.constant;
/**
*
* @operate sqlServer常量
* @date 2022/1/26 14:11
* @return
*/
public interface SqlServerConstant {
/**
* 添加注释模板SQL
*/
String COMMENT_SQL = " EXECUTE sp_addextendedproperty N'MS_Description', N'%s', N'SCHEMA', N'%s', N'table', N'%S', N'column', N'%S' ";
/**
* 查询列信息模板SQL
*/
String QUERY_COLUMNS_SQL = " SELECT cast(a.name AS VARCHAR(500)) AS TABLE_NAME,cast(b.name AS VARCHAR(500)) AS COLUMN_NAME, isnull(CAST ( c.VALUE AS NVARCHAR ( 500 ) ),'') AS COMMENTS, " +
" CASE b.is_nullable WHEN 1 THEN 'YES' ELSE 'NO' END as NULLVALUE,cast(sys.types.name AS VARCHAR (500)) AS DATA_TYPE," +
" ( SELECT CASE count(1) WHEN 1 then 'PRI' ELSE '' END FROM syscolumns,sysobjects,sysindexes,sysindexkeys,systypes WHERE syscolumns.xusertype = systypes.xusertype " +
" AND syscolumns.id = object_id (a.name) AND sysobjects.xtype = 'PK' AND sysobjects.parent_obj = syscolumns.id " +
" AND sysindexes.id = syscolumns.id AND sysobjects.name = sysindexes.name AND sysindexkeys.id = syscolumns.id AND sysindexkeys.indid = sysindexes.indid AND syscolumns.colid = sysindexkeys.colid " +
" AND syscolumns.name = b.name) as 'KEY', b.is_identity isIdentity , '' as CHARACTER_SET_NAME, '' as COLLATION_NAME, 0 as ORDINAL_POSITION, 0 as NUMERIC_PRECISION, 0 as NUMERIC_SCALE, '' as AUTO_INCREMENT FROM ( select name,object_id from sys.tables UNION all select name,object_id from sys.views ) a INNER JOIN sys.columns b " +
" ON b.object_id = a.object_id LEFT JOIN sys.types ON b.user_type_id = sys.types.user_type_id LEFT JOIN sys.extended_properties c ON c.major_id = b.object_id AND c.minor_id = b.column_id " +
" WHERE a.name = '%s' and sys.types.name !='sysname' ";
/**
* 查询schema模板SQL
*/
String QUERY_SCHEMA_SQL = " SELECT distinct table_schema from INFORMATION_SCHEMA.tables ";
/**
* 根据schema查询table信息模板SQL
*/
String QUERY_TABLE_BY_SCHEMA_SQL = " SELECT table_name ,table_schema, '' as type, '' as CATALOG, '' as ENGINE , '' as OPTIONS ,0 as rows , null as CREATE_TIME, null as UPDATE_TIME,null AS COMMENTS FROM INFORMATION_SCHEMA.tables WHERE TABLE_SCHEMA = '%s' ";
}
package com.dlink.metadata.convert;
import com.dlink.metadata.rules.DbColumnType;
import com.dlink.metadata.rules.IColumnType;
/**
*
* @operate
* @date 2022/1/26 14:23
* @return
*/
public class SqlServerTypeConvert implements ITypeConvert {
@Override
public IColumnType convert(String columnType) {
String t = columnType.toLowerCase();
if (t.contains("char") || t.contains("varchar") || t.contains("text") ||
t.contains("nchar") || t.contains("nvarchar") || t.contains("ntext")
|| t.contains("uniqueidentifier") || t.contains("sql_variant")) {
return DbColumnType.STRING;
} else if(t.contains("bit")){
return DbColumnType.BOOLEAN;
}else if(t.contains("int") || t.contains("tinyint") || t.contains("smallint")){
return DbColumnType.INTEGER;
}else if(t.contains("bigint")){
return DbColumnType.LONG;
}else if(t.contains("float") ){
return DbColumnType.DOUBLE;
}else if(t.contains("decimal") || t.contains("money") || t.contains("smallmoney")
|| t.contains("numeric")){
return DbColumnType.BIG_DECIMAL;
}else if(t.contains("real")){
return DbColumnType.FLOAT;
}else if(t.contains("smalldatetime") || t.contains("datetime")){
return DbColumnType.TIMESTAMP;
}else if(t.contains("timestamp") || t.contains("binary") || t.contains("varbinary") || t.contains("image")){
return DbColumnType.BYTE_ARRAY;
}
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.metadata.constant.SqlServerConstant;
import com.dlink.metadata.convert.ITypeConvert;
import com.dlink.metadata.convert.SqlServerTypeConvert;
import com.dlink.metadata.query.IDBQuery;
import com.dlink.metadata.query.SqlServerQuery;
import com.dlink.model.Column;
import com.dlink.model.Table;
import java.util.ArrayList;
import java.util.List;
/**
*
* @author lcg
* @operate
* @date 2022/1/26 14:23
* @return
*/
public class SqlServerDriver extends AbstractJdbcDriver {
@Override
public IDBQuery getDBQuery() {
return new SqlServerQuery();
}
@Override
public ITypeConvert getTypeConvert() {
return new SqlServerTypeConvert();
}
@Override
String getDriverClass() {
return "com.microsoft.sqlserver.jdbc.SQLServerDriver";
}
@Override
public String getType() {
return "SqlServer";
}
@Override
public String getName() {
return "SqlServer数据库";
}
@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(columns.get(i).isNullable()){
sb.append(" NOT NULL");
}else{
sb.append(" NULL");
}
}
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(" ) ");
}
sb.append(") GO ");
for (Column column : columns) {
String comment = column.getComment();
if(comment != null && !comment.isEmpty()){
sb.append(String.format(SqlServerConstant.COMMENT_SQL, comment, table.getSchema() == null || table.getSchema().isEmpty() ? "dbo":table.getSchema(),
table.getName(), column.getName()) + " GO ");
}
}
return sb.toString();
}
}
package com.dlink.metadata.query;
import com.dlink.metadata.constant.SqlServerConstant;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
*
* @author lcg
* @operate
* @date 2022/1/26 15:42
* @return
*/
public class SqlServerQuery extends AbstractDBQuery {
@Override
public String schemaAllSql() {
return SqlServerConstant.QUERY_SCHEMA_SQL;
}
@Override
public String tablesSql(String schemaName) {
return String.format(SqlServerConstant.QUERY_TABLE_BY_SCHEMA_SQL, schemaName);
}
@Override
public String columnsSql(String schemaName, String tableName) {
return String.format(SqlServerConstant.QUERY_COLUMNS_SQL, tableName);
}
@Override
public String schemaName() {
return "TABLE_SCHEMA";
}
@Override
public String tableName() {
return "TABLE_NAME";
}
@Override
public String tableType() {
return "TYPE";
}
@Override
public String tableComment() {
return "COMMENTS";
}
@Override
public String columnName() {
return "COLUMN_NAME";
}
@Override
public String columnType() {
return "DATA_TYPE";
}
@Override
public String columnComment() {
return "COMMENTS";
}
@Override
public String columnKey() {
return "KEY";
}
public boolean isKeyIdentity(ResultSet results) throws SQLException {
return 1 == results.getInt("isIdentity");
}
public String isNullable() {
return "NULLVALUE";
}
}
package com.dlink.metadata;
import com.dlink.metadata.driver.Driver;
import com.dlink.metadata.driver.DriverConfig;
import com.dlink.metadata.result.JdbcSelectResult;
import com.dlink.model.Column;
import com.dlink.model.Schema;
import com.dlink.model.Table;
import org.junit.Before;
import org.junit.Test;
import java.sql.SQLException;
import java.util.LinkedHashMap;
import java.util.List;
public class SqlServerTest {
private Driver driver;
@Before
public void init() {
DriverConfig config = new DriverConfig();
config.setType("SqlServer");
config.setIp("192.168.68.133");
config.setPort(1433);
config.setUsername("sa");
config.setPassword("OcP2020123");
config.setUrl("jdbc:sqlserver://192.168.68.133:1433;DatabaseName=test");
try {
driver = Driver.build(config).connect();
} catch (Exception e) {
System.err.println("连接创建失败:" + e.getMessage());
}
}
@Test
public void test() throws SQLException {
//test
String test = driver.test();
System.out.println(test);
System.out.println("schema && table...");
testSchema();
System.out.println("columns...");
testColumns();
System.out.println("query...");
query();
}
@Test
public void testSchema() {
//schema && table
List<Schema> schemasAndTables = driver.getSchemasAndTables();
for (Schema schemasAndTable : schemasAndTables) {
List<Table> tables = schemasAndTable.getTables();
for (Table table : tables) {
System.out.println(table.getName() + " " + table.getSchema());
}
}
}
@Test
public void testColumns() {
// columns
List<Column> columns = driver.listColumns("dbo", "t_user");
for (Column column : columns) {
System.out.println(column.getName() + " " + column.getType() + " " + column.getComment());
}
}
@Test
public void query() {
JdbcSelectResult selectResult = driver.query("select * from t_user", 10);
List<LinkedHashMap<String, Object>> rowData = selectResult.getRowData();
for (LinkedHashMap<String, Object> rowDatum : rowData) {
System.out.println(rowData);
}
}
}
......@@ -17,6 +17,8 @@
<module>dlink-metadata-oracle</module>
<module>dlink-metadata-clickhouse</module>
<module>dlink-metadata-postgresql</module>
<module>dlink-metadata-sqlserver</module>
<module>dlink-metadata-doris</module>
</modules>
......
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