Parcourir la source

add sqlserver connector

AE86 il y a 4 ans
Parent
commit
106640f965
19 fichiers modifiés avec 231 ajouts et 167 suppressions
  1. 21 0
      dbsyncer-biz/src/main/java/org/dbsyncer/biz/checker/impl/connector/DqlSqlServerConfigChecker.java
  2. 13 0
      dbsyncer-biz/src/main/java/org/dbsyncer/biz/checker/impl/connector/SqlServerConfigChecker.java
  3. 1 16
      dbsyncer-connector/src/main/java/org/dbsyncer/connector/config/MetaInfo.java
  4. 1 16
      dbsyncer-connector/src/main/java/org/dbsyncer/connector/constant/DatabaseConstant.java
  5. 42 40
      dbsyncer-connector/src/main/java/org/dbsyncer/connector/database/AbstractDatabaseConnector.java
  6. 2 11
      dbsyncer-connector/src/main/java/org/dbsyncer/connector/database/Database.java
  7. 1 1
      dbsyncer-connector/src/main/java/org/dbsyncer/connector/database/sqlbuilder/SqlBuilderQuery.java
  8. 6 1
      dbsyncer-connector/src/main/java/org/dbsyncer/connector/enums/ConnectorEnum.java
  9. 1 8
      dbsyncer-connector/src/main/java/org/dbsyncer/connector/mysql/MysqlConnector.java
  10. 1 9
      dbsyncer-connector/src/main/java/org/dbsyncer/connector/oracle/OracleConnector.java
  11. 1 8
      dbsyncer-connector/src/main/java/org/dbsyncer/connector/sql/DQLMysqlConnector.java
  12. 1 8
      dbsyncer-connector/src/main/java/org/dbsyncer/connector/sql/DQLOracleConnector.java
  13. 55 0
      dbsyncer-connector/src/main/java/org/dbsyncer/connector/sql/DQLSqlServerConnector.java
  14. 33 10
      dbsyncer-connector/src/main/java/org/dbsyncer/connector/sqlserver/SqlServerConnector.java
  15. 45 0
      dbsyncer-web/src/main/resources/public/connector/addDqlSqlServer.html
  16. 4 19
      dbsyncer-web/src/main/resources/public/connector/addSqlServer.html
  17. 0 11
      dbsyncer-web/src/main/resources/static/js/common.js
  18. 2 8
      dbsyncer-web/src/main/resources/static/js/connector/add.js
  19. 1 1
      pom.xml

+ 21 - 0
dbsyncer-biz/src/main/java/org/dbsyncer/biz/checker/impl/connector/DqlSqlServerConfigChecker.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 2021/5/18 20:17
+ */
+@Component
+public class DqlSqlServerConfigChecker extends AbstractDataBaseConfigChecker {
+
+    @Override
+    public void modify(Connector connector, Map<String, String> params) {
+        super.modify(connector, params);
+        super.modifyDql(connector, params);
+    }
+}

+ 13 - 0
dbsyncer-biz/src/main/java/org/dbsyncer/biz/checker/impl/connector/SqlServerConfigChecker.java

@@ -0,0 +1,13 @@
+package org.dbsyncer.biz.checker.impl.connector;
+
+import org.springframework.stereotype.Component;
+
+/**
+ * @author AE86
+ * @version 1.0.0
+ * @date 2021/5/18 20:17
+ */
+@Component
+public class SqlServerConfigChecker extends AbstractDataBaseConfigChecker {
+
+}

+ 1 - 16
dbsyncer-connector/src/main/java/org/dbsyncer/connector/config/MetaInfo.java

@@ -18,11 +18,6 @@ public class MetaInfo {
      */
     private List<Field> column;
 
-    /**
-     * 总条数
-     */
-    private long count;
-
     public List<Field> getColumn() {
         return column;
     }
@@ -31,18 +26,8 @@ public class MetaInfo {
         this.column = column;
         return this;
     }
-
-    public long getCount() {
-        return count;
-    }
-
-    public MetaInfo setCount(long count) {
-        this.count = count;
-        return this;
-    }
-
     @Override
     public String toString() {
-        return new StringBuilder().append("MetaInfo{").append("column=").append(column).append(", count=").append(count).append('}').toString();
+        return new StringBuilder().append("MetaInfo{").append("column=").append(column).append('}').toString();
     }
 }

+ 1 - 16
dbsyncer-connector/src/main/java/org/dbsyncer/connector/constant/DatabaseConstant.java

@@ -8,11 +8,6 @@ public class DatabaseConstant {
      */
     public static final String MYSQL_PAGE_SQL = " LIMIT ?,?";
 
-    /**
-     * Mysql表列语句
-     */
-    public static final String MYSQL_TABLE_COLUMN_SQL = " LIMIT 0,0";
-
     //*********************************** Oracle **************************************//
     /**
      * Oracle分页语句开始
@@ -24,16 +19,6 @@ public class DatabaseConstant {
      */
     public static final String ORACLE_PAGE_SQL_END = ")A WHERE ROWNUM <= ?) WHERE RN > ?";
 
-    /**
-     * Oracle表列语句开始
-     */
-    public static final String ORACLE_TABLE_COLUMN_SQL_START = "SELECT A.* FROM (";
-
-    /**
-     * Oracle表列语句结束
-     */
-    public static final String ORACLE_TABLE_COLUMN_SQL_END = ")A WHERE ROWNUM < 1";
-
     //*********************************** SqlServer **************************************//
     /**
      * SqlServer分页语句开始
@@ -43,6 +28,6 @@ public class DatabaseConstant {
     /**
      * SqlServer分页语句结束
      */
-    public static final String SQLSERVER_PAGE_SQL_END = " OFFSET(?-1) * ? ROWS FETCH NEXT ? ROWS ONLY";
+    public static final String SQLSERVER_PAGE_SQL_END = " OFFSET ? ROWS FETCH NEXT ? ROWS ONLY";
 
 }

+ 42 - 40
dbsyncer-connector/src/main/java/org/dbsyncer/connector/database/AbstractDatabaseConnector.java

@@ -69,8 +69,8 @@ public abstract class AbstractDatabaseConnector implements Database {
         try {
             jdbcTemplate = getJdbcTemplate(cfg);
             String quotation = buildSqlWithQuotation();
-            String queryMetaSql = getTableColumnSql(new StringBuilder("SELECT * FROM ").append(quotation).append(tableName).append(quotation).toString());
-            metaInfo = DatabaseUtil.getMetaInfo(jdbcTemplate, queryMetaSql, tableName);
+            StringBuilder queryMetaSql = new StringBuilder("SELECT * FROM ").append(quotation).append(tableName).append(quotation).append(" WHERE 1 != 1");
+            metaInfo = DatabaseUtil.getMetaInfo(jdbcTemplate, queryMetaSql.toString(), tableName);
         } catch (Exception e) {
             logger.error(e.getMessage());
         } finally {
@@ -345,7 +345,8 @@ public abstract class AbstractDatabaseConnector implements Database {
         MetaInfo metaInfo = null;
         try {
             jdbcTemplate = getJdbcTemplate(cfg);
-            String queryMetaSql = getTableColumnSql(cfg.getSql());
+            String sql = cfg.getSql().toUpperCase();
+            String queryMetaSql = StringUtils.contains(sql, " WHERE ") ? sql + " AND 1!=1 " : sql + " WHERE 1!=1 ";
             metaInfo = DatabaseUtil.getMetaInfo(jdbcTemplate, queryMetaSql, cfg.getTable());
         } catch (Exception e) {
             logger.error(e.getMessage());
@@ -377,11 +378,11 @@ public abstract class AbstractDatabaseConnector implements Database {
         if (StringUtils.isNotBlank(queryFilterSql)) {
             querySql += queryFilterSql;
         }
-        map.put(SqlBuilderEnum.QUERY.getName(), getPageSql(null, null, querySql));
-
-        // 获取查询总数SQL
         String quotation = buildSqlWithQuotation();
         String pk = DatabaseUtil.findTablePrimaryKey(commandConfig.getOriginalTable(), quotation);
+        map.put(SqlBuilderEnum.QUERY.getName(), getPageSql(querySql, pk));
+
+        // 获取查询总数SQL
         StringBuilder queryCount = new StringBuilder();
         queryCount.append("SELECT COUNT(1) FROM (").append(table.getName());
         if (StringUtils.isNotBlank(queryFilterSql)) {
@@ -411,7 +412,7 @@ public abstract class AbstractDatabaseConnector implements Database {
      * @param filter
      * @return
      */
-    private String getQueryFilterSql(List<Filter> filter) {
+    protected String getQueryFilterSql(List<Filter> filter) {
         if (CollectionUtils.isEmpty(filter)) {
             return "";
         }
@@ -441,37 +442,6 @@ public abstract class AbstractDatabaseConnector implements Database {
         return sql.toString();
     }
 
-    /**
-     * 根据过滤条件获取查询SQL
-     *
-     * @param queryOperator and/or
-     * @param filter
-     * @return
-     */
-    private String getFilterSql(String queryOperator, List<Filter> filter) {
-        List<Filter> list = filter.stream().filter(f -> StringUtils.equals(f.getOperation(), queryOperator)).collect(Collectors.toList());
-        if (CollectionUtils.isEmpty(list)) {
-            return "";
-        }
-
-        int size = list.size();
-        int end = size - 1;
-        StringBuilder sql = new StringBuilder();
-        sql.append("(");
-        Filter c = null;
-        String quotation = buildSqlWithQuotation();
-        for (int i = 0; i < size; i++) {
-            c = list.get(i);
-            // "USER" = 'zhangsan'
-            sql.append(quotation).append(c.getName()).append(quotation).append(c.getFilter()).append("'").append(c.getValue()).append("'");
-            if (i < end) {
-                sql.append(" ").append(queryOperator).append(" ");
-            }
-        }
-        sql.append(")");
-        return sql.toString();
-    }
-
     /**
      * 获取查询SQL
      *
@@ -481,14 +451,15 @@ public abstract class AbstractDatabaseConnector implements Database {
      * @param queryFilterSQL
      * @return
      */
-    private String buildSql(String type, Table table, Table originalTable, String queryFilterSQL) {
+    protected String buildSql(String type, Table table, Table originalTable, 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)) {
-            throw new ConnectorException("Column can not be null.");
+            logger.warn("Table column is null.");
+            return null;
         }
         String pk = null;
         Set<String> mark = new HashSet<>();
@@ -523,6 +494,37 @@ public abstract class AbstractDatabaseConnector implements Database {
         return SqlBuilderEnum.getSqlBuilder(type).buildSql(config);
     }
 
+    /**
+     * 根据过滤条件获取查询SQL
+     *
+     * @param queryOperator and/or
+     * @param filter
+     * @return
+     */
+    private String getFilterSql(String queryOperator, List<Filter> filter) {
+        List<Filter> list = filter.stream().filter(f -> StringUtils.equals(f.getOperation(), queryOperator)).collect(Collectors.toList());
+        if (CollectionUtils.isEmpty(list)) {
+            return "";
+        }
+
+        int size = list.size();
+        int end = size - 1;
+        StringBuilder sql = new StringBuilder();
+        sql.append("(");
+        Filter c = null;
+        String quotation = buildSqlWithQuotation();
+        for (int i = 0; i < size; i++) {
+            c = list.get(i);
+            // "USER" = 'zhangsan'
+            sql.append(quotation).append(c.getName()).append(quotation).append(c.getFilter()).append("'").append(c.getValue()).append("'");
+            if (i < end) {
+                sql.append(" ").append(queryOperator).append(" ");
+            }
+        }
+        sql.append(")");
+        return sql.toString();
+    }
+
     /**
      * @param ps     参数构造器
      * @param fields 同步字段,例如[{name=ID, type=4}, {name=NAME, type=12}]

+ 2 - 11
dbsyncer-connector/src/main/java/org/dbsyncer/connector/database/Database.java

@@ -10,23 +10,14 @@ public interface Database extends Connector {
 
     void close(JdbcTemplate jdbcTemplate);
 
-    /**
-     * 获取表列信息SQL
-     *
-     * @param querySQL
-     * @return
-     */
-    String getTableColumnSql(String querySQL);
-
     /**
      * 获取分页SQL
      *
-     * @param tableName
-     * @param pk
      * @param querySQL
+     * @param pk
      * @return
      */
-    String getPageSql(String tableName, String pk, String querySQL);
+    String getPageSql(String querySQL, String pk);
 
     /**
      * 获取分页参数

+ 1 - 1
dbsyncer-connector/src/main/java/org/dbsyncer/connector/database/sqlbuilder/SqlBuilderQuery.java

@@ -19,7 +19,7 @@ public class SqlBuilderQuery extends AbstractSqlBuilder {
     public String buildSql(SqlBuilderConfig config) {
         // 分页语句
         Database database = config.getDatabase();
-        return database.getPageSql(config.getTableName(), config.getPk(), buildQuerySql(config));
+        return database.getPageSql(buildQuerySql(config), config.getPk());
     }
 
     @Override

+ 6 - 1
dbsyncer-connector/src/main/java/org/dbsyncer/connector/enums/ConnectorEnum.java

@@ -10,6 +10,7 @@ import org.dbsyncer.connector.oracle.OracleConnector;
 import org.dbsyncer.connector.redis.RedisConnector;
 import org.dbsyncer.connector.sql.DQLMysqlConnector;
 import org.dbsyncer.connector.sql.DQLOracleConnector;
+import org.dbsyncer.connector.sql.DQLSqlServerConnector;
 import org.dbsyncer.connector.sqlserver.SqlServerConnector;
 
 /**
@@ -30,7 +31,7 @@ public enum ConnectorEnum {
      */
     ORACLE("Oracle", new OracleConnector(), DatabaseConfig.class),
     /**
-     * Mysql 连接器
+     * SqlServer 连接器
      */
     SQL_SERVER("SqlServer", new SqlServerConnector(), DatabaseConfig.class),
     /**
@@ -41,6 +42,10 @@ public enum ConnectorEnum {
      * DqlOracle 连接器
      */
     DQL_ORACLE("DqlOracle", new DQLOracleConnector(), DatabaseConfig.class),
+    /**
+     * DqlSqlServer 连接器
+     */
+    DQL_SQL_SERVER("DqlSqlServer", new DQLSqlServerConnector(), DatabaseConfig.class),
     /**
      * Redis 连接器
      */

+ 1 - 8
dbsyncer-connector/src/main/java/org/dbsyncer/connector/mysql/MysqlConnector.java

@@ -12,14 +12,7 @@ public final class MysqlConnector extends AbstractDatabaseConnector {
     }
 
     @Override
-    public String getTableColumnSql(String querySQL) {
-        // Mysql 表列查询
-        return querySQL + DatabaseConstant.MYSQL_TABLE_COLUMN_SQL;
-    }
-
-    @Override
-    public String getPageSql(String tableName, String pk, String querySQL) {
-        // Mysql 分页查询
+    public String getPageSql(String querySQL, String pk) {
         return querySQL + DatabaseConstant.MYSQL_PAGE_SQL;
     }
 

+ 1 - 9
dbsyncer-connector/src/main/java/org/dbsyncer/connector/oracle/OracleConnector.java

@@ -6,21 +6,13 @@ import org.dbsyncer.connector.database.AbstractDatabaseConnector;
 
 public final class OracleConnector extends AbstractDatabaseConnector {
 
-    @Override
-    public String getTableColumnSql(String querySQL) {
-        // Oracle 表列查询
-        return DatabaseConstant.ORACLE_TABLE_COLUMN_SQL_START + querySQL + DatabaseConstant.ORACLE_TABLE_COLUMN_SQL_END;
-    }
-
     @Override
     protected String getTablesSql(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
-    public String getPageSql(String tableName, String pk, String querySQL) {
-        // Oracle 分页查询
+    public String getPageSql(String querySQL, String pk) {
         return DatabaseConstant.ORACLE_PAGE_SQL_START + querySQL + DatabaseConstant.ORACLE_PAGE_SQL_END;
     }
 

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

@@ -18,14 +18,7 @@ public final class DQLMysqlConnector extends AbstractDatabaseConnector {
     }
 
     @Override
-    public String getTableColumnSql(String querySQL) {
-        // Mysql 表列查询
-        return querySQL + DatabaseConstant.MYSQL_TABLE_COLUMN_SQL;
-    }
-
-    @Override
-    public String getPageSql(String tableName, String pk, String querySQL) {
-        // Mysql 分页查询
+    public String getPageSql(String querySQL, String pk) {
         return querySQL + DatabaseConstant.MYSQL_PAGE_SQL;
     }
 

+ 1 - 8
dbsyncer-connector/src/main/java/org/dbsyncer/connector/sql/DQLOracleConnector.java

@@ -18,14 +18,7 @@ public final class DQLOracleConnector extends AbstractDatabaseConnector {
     }
 
     @Override
-    public String getTableColumnSql(String querySQL) {
-        // Oracle 表列查询
-        return DatabaseConstant.ORACLE_TABLE_COLUMN_SQL_START + querySQL + DatabaseConstant.ORACLE_TABLE_COLUMN_SQL_END;
-    }
-
-    @Override
-    public String getPageSql(String tableName, String pk, String querySQL) {
-        // Oracle 分页查询
+    public String getPageSql(String querySQL, String pk) {
         return DatabaseConstant.ORACLE_PAGE_SQL_START + querySQL + DatabaseConstant.ORACLE_PAGE_SQL_END;
     }
 

+ 55 - 0
dbsyncer-connector/src/main/java/org/dbsyncer/connector/sql/DQLSqlServerConnector.java

@@ -0,0 +1,55 @@
+package org.dbsyncer.connector.sql;
+
+import org.apache.commons.lang.StringUtils;
+import org.dbsyncer.connector.ConnectorException;
+import org.dbsyncer.connector.config.CommandConfig;
+import org.dbsyncer.connector.config.ConnectorConfig;
+import org.dbsyncer.connector.config.DatabaseConfig;
+import org.dbsyncer.connector.config.MetaInfo;
+import org.dbsyncer.connector.constant.DatabaseConstant;
+import org.dbsyncer.connector.database.AbstractDatabaseConnector;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.List;
+import java.util.Map;
+
+public final class DQLSqlServerConnector extends AbstractDatabaseConnector {
+
+    private final Logger logger = LoggerFactory.getLogger(getClass());
+
+    @Override
+    protected String getTablesSql(DatabaseConfig config) {
+        return "SELECT NAME FROM SYS.TABLES WHERE SCHEMA_ID = SCHEMA_ID('DBO')";
+    }
+
+    @Override
+    public String getPageSql(String querySQL, String pk) {
+        if(StringUtils.isBlank(pk)){
+            logger.error("Table primary key can not be empty.");
+            throw new ConnectorException("Table primary key can not be empty.");
+        }
+        return new StringBuilder(querySQL).append(DatabaseConstant.SQLSERVER_PAGE_SQL_START).append(pk).append(DatabaseConstant.SQLSERVER_PAGE_SQL_END).toString();
+    }
+
+    @Override
+    public Object[] getPageArgs(int pageIndex, int pageSize) {
+        return new Object[]{(pageIndex - 1) * pageSize, pageSize};
+    }
+
+    @Override
+    public List<String> getTable(ConnectorConfig config) {
+        return super.getDqlTable(config);
+    }
+
+    @Override
+    public MetaInfo getMetaInfo(ConnectorConfig config, String tableName) {
+        return super.getDqlMetaInfo(config);
+    }
+
+    @Override
+    public Map<String, String> getSourceCommand(CommandConfig commandConfig) {
+        return super.getDqlSourceCommand(commandConfig,false);
+    }
+
+}

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

@@ -2,35 +2,34 @@ package org.dbsyncer.connector.sqlserver;
 
 import org.apache.commons.lang.StringUtils;
 import org.dbsyncer.connector.ConnectorException;
+import org.dbsyncer.connector.config.CommandConfig;
 import org.dbsyncer.connector.config.DatabaseConfig;
+import org.dbsyncer.connector.config.Table;
+import org.dbsyncer.connector.constant.ConnectorConstant;
 import org.dbsyncer.connector.constant.DatabaseConstant;
 import org.dbsyncer.connector.database.AbstractDatabaseConnector;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.util.HashMap;
+import java.util.Map;
+
 public final class SqlServerConnector extends AbstractDatabaseConnector implements SqlServer {
 
     private final Logger logger = LoggerFactory.getLogger(getClass());
 
     @Override
     protected String getTablesSql(DatabaseConfig config) {
-        return "select name from sysobjects where xtype='u'";
-    }
-
-    @Override
-    public String getTableColumnSql(String querySQL) {
-        return querySQL;
+        return "SELECT NAME FROM SYS.TABLES WHERE SCHEMA_ID = SCHEMA_ID('DBO')";
     }
 
     @Override
-    public String getPageSql(String tableName, String pk, String querySQL) {
+    public String getPageSql(String querySQL, String pk) {
         if(StringUtils.isBlank(pk)){
             logger.error("Table primary key can not be empty.");
             throw new ConnectorException("Table primary key can not be empty.");
         }
-        // SqlServer 分页查询
-        // sql> SELECT * FROM SD_USER ORDER BY USER.ID OFFSET(3-1) * 1000 ROWS FETCH NEXT 1000 ROWS ONLY
-        return new StringBuilder(querySQL).append(DatabaseConstant.SQLSERVER_PAGE_SQL_START).append(tableName).append(".").append(pk).append(DatabaseConstant.SQLSERVER_PAGE_SQL_END).toString();
+        return new StringBuilder(querySQL).append(DatabaseConstant.SQLSERVER_PAGE_SQL_START).append(pk).append(DatabaseConstant.SQLSERVER_PAGE_SQL_END).toString();
     }
 
     @Override
@@ -38,4 +37,28 @@ public final class SqlServerConnector extends AbstractDatabaseConnector implemen
         return new Object[]{(pageIndex - 1) * pageSize, pageSize};
     }
 
+    @Override
+    public Map<String, String> getSourceCommand(CommandConfig commandConfig) {
+        // 获取过滤SQL
+        String queryFilterSql = this.getQueryFilterSql(commandConfig.getFilter());
+
+        // 获取查询SQL
+        Table table = commandConfig.getTable();
+        Map<String, String> map = new HashMap<>();
+
+        String query = ConnectorConstant.OPERTION_QUERY;
+        map.put(query, this.buildSql(query, table, commandConfig.getOriginalTable(), queryFilterSql));
+
+        // 获取查询总数SQL
+        StringBuilder queryCount = new StringBuilder();
+        if (StringUtils.isNotBlank(queryFilterSql)) {
+            queryCount.append("SELECT COUNT(*) FROM ").append(table.getName()).append(queryFilterSql);
+        }else{
+            // 从存储过程查询(定时更新总数,可能存在误差)
+            queryCount.append("SELECT ROWS FROM SYSINDEXES WHERE ID = OBJECT_ID('").append("DBO.").append(table.getName()).append("') AND INDID IN (0, 1)");
+        }
+        map.put(ConnectorConstant.OPERTION_QUERY_COUNT, queryCount.toString());
+        return map;
+    }
+
 }

+ 45 - 0
dbsyncer-web/src/main/resources/public/connector/addDqlSqlServer.html

@@ -0,0 +1,45 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml"
+      xmlns:th="http://www.thymeleaf.org" lang="zh-CN">
+
+<div th:fragment="content">
+    <div class="form-group">
+        <label class="col-sm-2 control-label">帐号 <strong class="driverVerifcateRequired">*</strong></label>
+        <div class="col-sm-4">
+            <input class="form-control" name="username" type="text" maxlength="32" dbsyncer-valid="require" placeholder="admin" th:value="${connector?.config?.username}"/>
+        </div>
+        <label class="col-sm-2 control-label">密码 <strong class="driverVerifcateRequired">*</strong></label>
+        <div class="col-sm-4 ">
+            <input class="form-control" name="password" type="password" maxlength="32" dbsyncer-valid="require" th:value="${connector?.config?.password}"/>
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="col-sm-2 control-label">SQL <strong class="driverVerifcateRequired">*</strong></label>
+        <div class="col-sm-10">
+            <textarea id="sql" name="sql" class="form-control" maxlength="1024" dbsyncer-valid="require" rows="10" th:text="${connector?.config?.sql}?:'SELECT T1.* FROM USER T1'"></textarea>
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="col-sm-2 control-label">主表 <strong class="driverVerifcateRequired">*</strong></label>
+        <div class="col-sm-4">
+            <input class="form-control" name="table" type="text" maxlength="32" dbsyncer-valid="require" placeholder="USER" th:value="${connector?.config?.table}"/>
+        </div>
+        <div class="col-sm-6 text-right">
+            <a href="javascript:beautifySql();"><span class="fa fa-magic fa-1x fa-flip-horizontal dbsyncer_pointer" title="美化SQL"></span>美化SQL</a>
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="col-sm-2 control-label">URL <strong class="driverVerifcateRequired">*</strong></label>
+        <div class="col-sm-10">
+            <textarea name="url" class="form-control" maxlength="1024" dbsyncer-valid="require" rows="5" th:text="${connector?.config?.url} ?: 'jdbc:sqlserver://127.0.0.1:1433;DatabaseName=test'"></textarea>
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="col-sm-2 control-label">驱动 </label>
+        <div class="col-sm-10">
+            <input class="form-control" readonly="true" name="driverClassName" type="text" th:value="${connector?.config?.driverClassName} ?: 'com.microsoft.sqlserver.jdbc.SQLServerDriver'" />
+        </div>
+    </div>
+</div>
+
+</html>

+ 4 - 19
dbsyncer-web/src/main/resources/public/connector/addSqlServer.html

@@ -6,38 +6,23 @@
     <div class="form-group">
         <label class="col-sm-2 control-label">帐号 <strong class="driverVerifcateRequired">*</strong></label>
         <div class="col-sm-4">
-            <input class="form-control" name="username" type="text" maxlength="32" dbsyncer-valid="require"
-                   placeholder="root" />
+            <input class="form-control" name="username" type="text" maxlength="32" dbsyncer-valid="require" placeholder="root" th:value="${connector?.config?.username}"/>
         </div>
         <label class="col-sm-2 control-label">密码 <strong class="driverVerifcateRequired">*</strong></label>
         <div class="col-sm-4 ">
-            <input class="form-control" name="password" type="password" maxlength="32" dbsyncer-valid="require" />
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="col-sm-2 control-label">表名 <strong class="driverVerifcateRequired">*</strong></label>
-        <div class="col-sm-10">
-            <input class="form-control" name="table" type="text" maxlength="32" dbsyncer-valid="require"
-                   placeholder="ASD_USER" />
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="col-sm-2 control-label">主键 <strong class="driverVerifcateRequired">*</strong></label>
-        <div class="col-sm-10">
-            <input class="form-control" name="primaryKey" type="text" maxlength="32" dbsyncer-valid="require"
-                   placeholder="primaryKey" />
+            <input class="form-control" name="password" type="password" maxlength="32" dbsyncer-valid="require" th:value="${connector?.config?.password}"/>
         </div>
     </div>
     <div class="form-group">
         <label class="col-sm-2 control-label">URL <strong class="driverVerifcateRequired">*</strong></label>
         <div class="col-sm-10">
-            <textarea name="url" class="form-control" maxlength="1024" dbsyncer-valid="require" rows="5">jdbc:sqlserver://127.0.0.1:1433;DatabaseName=test</textarea>
+            <textarea name="url" class="form-control" maxlength="1024" dbsyncer-valid="require" rows="5" th:text="${connector?.config?.url} ?: 'jdbc:sqlserver://127.0.0.1:1433;DatabaseName=test'"></textarea>
         </div>
     </div>
     <div class="form-group">
         <label class="col-sm-2 control-label">驱动 </label>
         <div class="col-sm-10">
-            <input class="form-control" readonly="true" name="driverClassName" type="text" value="com.microsoft.sqlserver.jdbc.SQLServerDriver" />
+            <input class="form-control" readonly="true" name="driverClassName" type="text" th:value="${connector?.config?.driverClassName} ?: 'com.microsoft.sqlserver.jdbc.SQLServerDriver'" />
         </div>
     </div>
 </div>

+ 0 - 11
dbsyncer-web/src/main/resources/static/js/common.js

@@ -94,15 +94,4 @@ function doGetter(url, params, action, loading) {
 // 全局Ajax get, 不显示加载动画
 function doGetWithoutLoading(url, params, action) {
     doGetter(url, params, action, false);
-}
-
-// ******************* 常量配置 ***************************
-// 连接器类型
-var ConnectorConstant = {
-    "Mysql" : $basePath + "/connector/page/addMysql",
-    "Oracle" : $basePath + "/connector/page/addOracle",
-    "SqlServer" : $basePath + "/connector/page/addSqlServer",
-    "DqlMysql" : $basePath + "/connector/page/addDqlMysql",
-    "DqlOracle" : $basePath + "/connector/page/addDqlOracle",
-    "Redis" : $basePath + "/connector/page/addRedis"
 }

+ 2 - 8
dbsyncer-web/src/main/resources/static/js/connector/add.js

@@ -26,14 +26,8 @@ function changeConnectorType($this) {
     //清空配置
     connectorConfig.html("");
 
-    //从公共js/common.js配置文件中读取常量
-    for (var key in ConnectorConstant) {
-        if (connType == key) {
-            //加载页面
-            connectorConfig.load(ConnectorConstant[key]);
-            break;
-        }
-    }
+    //加载页面
+    connectorConfig.load($basePath + "/connector/page/add" + connType);
 }
 
 $(function () {

+ 1 - 1
pom.xml

@@ -47,7 +47,7 @@
         <ojdbc6.version>11.2.0.4.0-atlassian-hosted</ojdbc6.version>
         <mysql.version>5.1.40</mysql.version>
         <mysql-binlog.version>0.21.0</mysql-binlog.version>
-        <mssql-jdbc.version>6.5.4.jre10-preview</mssql-jdbc.version>
+        <mssql-jdbc.version>8.2.0.jre8</mssql-jdbc.version>
         <json.version>20090211</json.version>
         <fastjson.version>1.2.75</fastjson.version>
         <junit.version>4.12</junit.version>