AE86 5 年之前
父节点
当前提交
ce90676ec4

+ 8 - 0
dbsyncer-biz/src/main/java/org/dbsyncer/biz/checker/impl/connector/DataBaseConfigChecker.java

@@ -32,4 +32,12 @@ public abstract class DataBaseConfigChecker implements ConnectorConfigChecker {
         config.setUrl(url);
         config.setDriverClassName(driverClassName);
     }
+
+    protected void modifyDql(Connector connector, Map<String, String> params) {
+        String sql = params.get("sql");
+        Assert.hasText(sql, "Sql is empty.");
+        DatabaseConfig config = (DatabaseConfig) connector.getConfig();
+        config.setSql(sql);
+    }
+
 }

+ 3 - 21
dbsyncer-biz/src/main/java/org/dbsyncer/biz/checker/impl/connector/DqlMysqlConfigChecker.java

@@ -1,10 +1,7 @@
 package org.dbsyncer.biz.checker.impl.connector;
 
-import org.dbsyncer.biz.checker.ConnectorConfigChecker;
-import org.dbsyncer.connector.config.DatabaseConfig;
 import org.dbsyncer.parser.model.Connector;
 import org.springframework.stereotype.Component;
-import org.springframework.util.Assert;
 
 import java.util.Map;
 
@@ -14,26 +11,11 @@ import java.util.Map;
  * @date 2020/1/8 15:17
  */
 @Component
-public class DqlMysqlConfigChecker implements ConnectorConfigChecker {
+public class DqlMysqlConfigChecker extends DataBaseConfigChecker {
 
     @Override
     public void modify(Connector connector, Map<String, String> params) {
-        String username = params.get("username");
-        String password = params.get("password");
-        String url = params.get("url");
-        String sql = params.get("sql");
-        String driverClassName = params.get("driverClassName");
-        Assert.hasText(username, "DqlMysqlConfigChecker modify username is empty.");
-        Assert.hasText(password, "DqlMysqlConfigChecker modify password is empty.");
-        Assert.hasText(url, "DqlMysqlConfigChecker modify url is empty.");
-        Assert.hasText(sql, "DqlMysqlConfigChecker modify sql is empty.");
-        Assert.hasText(driverClassName, "DqlMysqlConfigChecker modify driverClassName is empty.");
-
-        DatabaseConfig config = (DatabaseConfig) connector.getConfig();
-        config.setUsername(username);
-        config.setPassword(password);
-        config.setUrl(url);
-        config.setDriverClassName(driverClassName);
-        config.setSql(sql);
+        super.modify(connector, params);
+        super.modifyDql(connector, params);
     }
 }

+ 21 - 0
dbsyncer-biz/src/main/java/org/dbsyncer/biz/checker/impl/connector/DqlOracleConfigChecker.java

@@ -0,0 +1,21 @@
+package org.dbsyncer.biz.checker.impl.connector;
+
+import org.dbsyncer.parser.model.Connector;
+import org.springframework.stereotype.Component;
+
+import java.util.Map;
+
+/**
+ * @author AE86
+ * @version 1.0.0
+ * @date 2020/1/8 15:17
+ */
+@Component
+public class DqlOracleConfigChecker extends DataBaseConfigChecker {
+
+    @Override
+    public void modify(Connector connector, Map<String, String> params) {
+        super.modify(connector, params);
+        super.modifyDql(connector, params);
+    }
+}

+ 84 - 51
dbsyncer-connector/src/main/java/org/dbsyncer/connector/database/AbstractDatabaseConnector.java

@@ -27,9 +27,7 @@ public abstract class AbstractDatabaseConnector implements Database {
 
     private final Logger logger = LoggerFactory.getLogger(getClass());
 
-    protected abstract String getMetaSql(DatabaseConfig config, String tableName);
     protected abstract String getQueryTablesSql(DatabaseConfig config);
-    protected abstract String getQueryCountSql(String tableName);
 
     @Override
     public boolean isAlive(ConnectorConfig config) {
@@ -70,8 +68,9 @@ public abstract class AbstractDatabaseConnector implements Database {
         MetaInfo metaInfo = null;
         try {
             jdbcTemplate = getJdbcTemplate(cfg);
-            String metaSql = getMetaSql(cfg, tableName);
-            metaInfo = DatabaseUtil.getMetaInfo(jdbcTemplate, metaSql);
+            String quotation = buildSqlWithQuotation();
+            String metaSql = new StringBuilder().append("select * from ").append(quotation).append(tableName).append(quotation).toString();
+            metaInfo = DatabaseUtil.getMetaInfo(jdbcTemplate, metaSql, tableName);
         } catch (Exception e) {
             logger.error(e.getMessage());
         } finally {
@@ -96,7 +95,8 @@ public abstract class AbstractDatabaseConnector implements Database {
 
         // 获取查询总数SQL
         StringBuilder queryCount = new StringBuilder();
-        queryCount.append(getQueryCountSql(table.getName()));
+        String quotation = buildSqlWithQuotation();
+        queryCount.append("select count(*) from ").append(quotation).append(table.getName()).append(quotation);
         if (StringUtils.isNotBlank(queryFilterSql)) {
             queryCount.append(queryFilterSql);
         }
@@ -298,7 +298,7 @@ public abstract class AbstractDatabaseConnector implements Database {
     }
 
     /**
-     * 获取DQl元信息
+     * 获取DQL元信息
      *
      * @param config
      * @return
@@ -309,7 +309,7 @@ public abstract class AbstractDatabaseConnector implements Database {
         MetaInfo metaInfo = null;
         try {
             jdbcTemplate = getJdbcTemplate(cfg);
-            metaInfo = DatabaseUtil.getMetaInfo(jdbcTemplate, cfg.getSql());
+            metaInfo = DatabaseUtil.getMetaInfo(jdbcTemplate, cfg.getSql(), null);
         } catch (Exception e) {
             logger.error(e.getMessage());
         } finally {
@@ -320,57 +320,44 @@ public abstract class AbstractDatabaseConnector implements Database {
     }
 
     /**
-     * 查询语句表名和字段带上引号(默认不加)
+     * 获取DQL源配置
+     *
+     * @param commandConfig
+     * @param tableLabel
      * @return
      */
-    protected String buildSqlWithQuotation(){
-        return "";
+    protected Map<String, String> getDqlSourceCommand(CommandConfig commandConfig, String tableLabel){
+        // 获取过滤SQL
+        List<Filter> filter = commandConfig.getFilter();
+        String queryFilterSql = getQueryFilterSql(filter);
+
+        // 获取查询SQL
+        Table table = commandConfig.getTable();
+        Map<String, String> map = new HashMap<>();
+        String querySql = table.getName();
+
+        // 存在条件
+        if(StringUtils.isNotBlank(queryFilterSql)){
+            querySql += queryFilterSql;
+        }
+        map.put(SqlBuilderEnum.QUERY.getName(), querySql);
+
+        // 获取查询总数SQL
+        StringBuilder queryCount = new StringBuilder();
+        queryCount.append("select count(*) from (").append(table.getName()).append(")").append(tableLabel);
+        if (StringUtils.isNotBlank(queryFilterSql)) {
+            queryCount.append(queryFilterSql);
+        }
+        map.put(ConnectorConstant.OPERTION_QUERY_COUNT, queryCount.toString());
+        return map;
     }
 
     /**
-     * 获取查询SQL
-     *
-     * @param type           {@link SqlBuilderEnum}
-     * @param table
-     * @param queryFilterSQL
+     * 查询语句表名和字段带上引号(默认不加)
      * @return
      */
-    private String buildSql(String type, Table table, String queryFilterSQL) {
-        if (null == table) {
-            logger.error("Table can not be null.");
-            throw new ConnectorException("Table can not be null.");
-        }
-        List<Field> column = table.getColumn();
-        if (CollectionUtils.isEmpty(column)) {
-            logger.error("Table column can not be empty.");
-            throw new ConnectorException("Table column can not be empty.");
-        }
-        // 获取主键
-        String pk = null;
-        // 去掉重复的查询字段
-        List<String> filedNames = new ArrayList<>();
-        for (Field c : column) {
-            if (c.isPk()) {
-                pk = c.getName();
-            }
-            String name = c.getName();
-            // 如果没有重复
-            if (StringUtils.isNotBlank(name) && !filedNames.contains(name)) {
-                filedNames.add(name);
-            }
-        }
-        if (CollectionUtils.isEmpty(filedNames)) {
-            logger.error("The filedNames can not be empty.");
-            throw new ConnectorException("The filedNames can not be empty.");
-        }
-        String tableName = table.getName();
-        if (StringUtils.isBlank(tableName)) {
-            logger.error("Table name can not be empty.");
-            throw new ConnectorException("Table name can not be empty.");
-        }
-
-        String quotation = buildSqlWithQuotation();
-        return SqlBuilderEnum.getSqlBuilder(type).buildSql(tableName, pk, filedNames, queryFilterSQL, quotation, this);
+    protected String buildSqlWithQuotation(){
+        return "";
     }
 
     /**
@@ -440,6 +427,52 @@ public abstract class AbstractDatabaseConnector implements Database {
         return sql.toString();
     }
 
+    /**
+     * 获取查询SQL
+     *
+     * @param type {@link SqlBuilderEnum}
+     * @param table
+     * @param queryFilterSQL
+     * @return
+     */
+    private String buildSql(String type, Table table, String queryFilterSQL) {
+        if (null == table) {
+            logger.error("Table can not be null.");
+            throw new ConnectorException("Table can not be null.");
+        }
+        List<Field> column = table.getColumn();
+        if (CollectionUtils.isEmpty(column)) {
+            logger.error("Table column can not be empty.");
+            throw new ConnectorException("Table column can not be empty.");
+        }
+        // 获取主键
+        String pk = null;
+        // 去掉重复的查询字段
+        List<String> filedNames = new ArrayList<>();
+        for (Field c : column) {
+            if (c.isPk()) {
+                pk = c.getName();
+            }
+            String name = c.getName();
+            // 如果没有重复
+            if (StringUtils.isNotBlank(name) && !filedNames.contains(name)) {
+                filedNames.add(name);
+            }
+        }
+        if (CollectionUtils.isEmpty(filedNames)) {
+            logger.error("The filedNames can not be empty.");
+            throw new ConnectorException("The filedNames can not be empty.");
+        }
+        String tableName = table.getName();
+        if (StringUtils.isBlank(tableName)) {
+            logger.error("Table name can not be empty.");
+            throw new ConnectorException("Table name can not be empty.");
+        }
+
+        String quotation = buildSqlWithQuotation();
+        return SqlBuilderEnum.getSqlBuilder(type).buildSql(tableName, pk, filedNames, queryFilterSQL, quotation, this);
+    }
+
     /**
      * @param ps     参数构造器
      * @param fields 同步字段,例如[{name=ID, type=4}, {name=NAME, type=12}]

+ 0 - 10
dbsyncer-connector/src/main/java/org/dbsyncer/connector/mysql/MysqlConnector.java

@@ -6,21 +6,11 @@ import org.dbsyncer.connector.database.AbstractDatabaseConnector;
 
 public final class MysqlConnector extends AbstractDatabaseConnector {
 
-    @Override
-    public String getMetaSql(DatabaseConfig config, String tableName) {
-        return new StringBuilder().append("SELECT * FROM ").append(tableName).toString();
-    }
-
     @Override
     protected String getQueryTablesSql(DatabaseConfig config) {
         return "show tables";
     }
 
-    @Override
-    protected String getQueryCountSql(String tableName) {
-        return String.format("select count(*) from %s", tableName);
-    }
-
     @Override
     public String getPageSql(String tableName, String pk, String querySQL) {
         // Mysql 分页查询

+ 0 - 10
dbsyncer-connector/src/main/java/org/dbsyncer/connector/oracle/OracleConnector.java

@@ -6,22 +6,12 @@ import org.dbsyncer.connector.database.AbstractDatabaseConnector;
 
 public final class OracleConnector extends AbstractDatabaseConnector {
 
-    @Override
-    public String getMetaSql(DatabaseConfig config, String tableName) {
-        return String.format("select * from \"%s\"", tableName);
-    }
-
     @Override
     protected String getQueryTablesSql(DatabaseConfig config) {
         // "SELECT TABLE_NAME FROM ALL_TABLES WHERE OWNER='AE86'"
         return String.format("SELECT TABLE_NAME FROM ALL_TABLES WHERE OWNER='%s'", config.getUsername()).toUpperCase();
     }
 
-    @Override
-    protected String getQueryCountSql(String tableName) {
-        return String.format("select count(*) from \"%s\"", tableName);
-    }
-
     @Override
     public String getPageSql(String tableName, String pk, String querySQL) {
         // Oracle 分页查询

+ 8 - 11
dbsyncer-connector/src/main/java/org/dbsyncer/connector/sql/DQLMysqlConnector.java

@@ -1,5 +1,6 @@
 package org.dbsyncer.connector.sql;
 
+import org.dbsyncer.connector.config.CommandConfig;
 import org.dbsyncer.connector.config.ConnectorConfig;
 import org.dbsyncer.connector.config.DatabaseConfig;
 import org.dbsyncer.connector.config.MetaInfo;
@@ -7,24 +8,15 @@ import org.dbsyncer.connector.constant.DatabaseConstant;
 import org.dbsyncer.connector.database.AbstractDatabaseConnector;
 
 import java.util.List;
+import java.util.Map;
 
 public final class DQLMysqlConnector extends AbstractDatabaseConnector {
 
-    @Override
-    public String getMetaSql(DatabaseConfig config, String tableName) {
-        return config.getSql();
-    }
-
     @Override
     protected String getQueryTablesSql(DatabaseConfig config) {
         return "show tables";
     }
 
-    @Override
-    protected String getQueryCountSql(String tableName) {
-        return String.format("select count(*) from %s", tableName);
-    }
-
     @Override
     public String getPageSql(String tableName, String pk, String querySQL) {
         // Mysql 分页查询
@@ -33,7 +25,7 @@ public final class DQLMysqlConnector extends AbstractDatabaseConnector {
 
     @Override
     public Object[] getPageArgs(int pageIndex, int pageSize) {
-        return new Object[]{(pageIndex - 1) * pageSize, pageSize};
+        return new Object[] {(pageIndex - 1) * pageSize, pageSize};
     }
 
     @Override
@@ -45,4 +37,9 @@ public final class DQLMysqlConnector extends AbstractDatabaseConnector {
     public MetaInfo getMetaInfo(ConnectorConfig config, String tableName) {
         return super.getDqlMetaInfo(config);
     }
+
+    @Override
+    public Map<String, String> getSourceCommand(CommandConfig commandConfig) {
+        return super.getDqlSourceCommand(commandConfig, " _T");
+    }
 }

+ 7 - 10
dbsyncer-connector/src/main/java/org/dbsyncer/connector/sql/DQLOracleConnector.java

@@ -1,5 +1,6 @@
 package org.dbsyncer.connector.sql;
 
+import org.dbsyncer.connector.config.CommandConfig;
 import org.dbsyncer.connector.config.ConnectorConfig;
 import org.dbsyncer.connector.config.DatabaseConfig;
 import org.dbsyncer.connector.config.MetaInfo;
@@ -7,24 +8,15 @@ import org.dbsyncer.connector.constant.DatabaseConstant;
 import org.dbsyncer.connector.database.AbstractDatabaseConnector;
 
 import java.util.List;
+import java.util.Map;
 
 public final class DQLOracleConnector extends AbstractDatabaseConnector {
 
-    @Override
-    public String getMetaSql(DatabaseConfig config, String tableName) {
-        return config.getSql();
-    }
-
     @Override
     protected String getQueryTablesSql(DatabaseConfig config) {
         return String.format("SELECT TABLE_NAME FROM ALL_TABLES WHERE OWNER='%s'", config.getUsername()).toUpperCase();
     }
 
-    @Override
-    protected String getQueryCountSql(String tableName) {
-        return String.format("select count(*) from \"%s\"", tableName);
-    }
-
     @Override
     public String getPageSql(String tableName, String pk, String querySQL) {
         // Oracle 分页查询
@@ -46,6 +38,11 @@ public final class DQLOracleConnector extends AbstractDatabaseConnector {
         return super.getDqlMetaInfo(config);
     }
 
+    @Override
+    public Map<String, String> getSourceCommand(CommandConfig commandConfig) {
+        return super.getDqlSourceCommand(commandConfig, "");
+    }
+
     @Override
     protected String buildSqlWithQuotation(){
         return "\"";

+ 0 - 10
dbsyncer-connector/src/main/java/org/dbsyncer/connector/sqlserver/SqlServerConnector.java

@@ -11,21 +11,11 @@ public final class SqlServerConnector extends AbstractDatabaseConnector implemen
 
     private final Logger logger = LoggerFactory.getLogger(getClass());
 
-    @Override
-    public String getMetaSql(DatabaseConfig config, String tableName) {
-        return new StringBuilder().append("SELECT * FROM ").append(tableName).toString();
-    }
-
     @Override
     protected String getQueryTablesSql(DatabaseConfig config) {
         return "";
     }
 
-    @Override
-    protected String getQueryCountSql(String tableName) {
-        return "";
-    }
-
     @Override
     public String getPageSql(String tableName, String pk, String querySQL) {
         if(StringUtils.isBlank(pk)){

+ 8 - 6
dbsyncer-connector/src/main/java/org/dbsyncer/connector/util/DatabaseUtil.java

@@ -2,6 +2,7 @@ package org.dbsyncer.connector.util;
 
 import com.sun.rowset.CachedRowSetImpl;
 import org.apache.commons.dbcp.BasicDataSource;
+import org.apache.commons.lang.StringUtils;
 import org.dbsyncer.common.util.CollectionUtils;
 import org.dbsyncer.connector.ConnectorException;
 import org.dbsyncer.connector.config.DatabaseConfig;
@@ -65,9 +66,10 @@ public abstract class DatabaseUtil {
      *
      * @param jdbcTemplate
      * @param metaSql      查询元数据
+     * @param tableName    表名
      * @return
      */
-    public static MetaInfo getMetaInfo(JdbcTemplate jdbcTemplate, String metaSql) throws SQLException {
+    public static MetaInfo getMetaInfo(JdbcTemplate jdbcTemplate, String metaSql, String tableName) throws SQLException {
         SqlRowSet sqlRowSet = jdbcTemplate.queryForRowSet(metaSql);
         ResultSetWrappingSqlRowSet rowSet = (ResultSetWrappingSqlRowSet) sqlRowSet;
         CachedRowSetImpl resultSet = (CachedRowSetImpl) rowSet.getResultSet();
@@ -88,19 +90,19 @@ public abstract class DatabaseUtil {
             String name = null;
             String label = null;
             String typeName = null;
-            String tableName = null;
+            String table = null;
             int columnType;
             boolean pk;
             for (int i = 1; i <= columnCount; i++) {
-                tableName = metaData.getTableName(i);
-                if (null == tables.get(tableName)) {
-                    tables.putIfAbsent(tableName, findTablePrimaryKeys(md, tableName));
+                table = StringUtils.isNotBlank(tableName) ? tableName : metaData.getTableName(i);
+                if (null == tables.get(table)) {
+                    tables.putIfAbsent(table, findTablePrimaryKeys(md, table));
                 }
                 name = metaData.getColumnName(i);
                 label = metaData.getColumnLabel(i);
                 typeName = metaData.getColumnTypeName(i);
                 columnType = metaData.getColumnType(i);
-                pk = isPk(tables, tableName, name);
+                pk = isPk(tables, table, name);
                 fields.add(new Field(label, typeName, columnType, pk));
             }
         } finally {