feat: 支持 SQL Server

This commit is contained in:
taojinlong 2021-02-23 17:50:04 +08:00
parent 0afbbf3174
commit 1c8399ed26
11 changed files with 92 additions and 107 deletions

View File

@ -91,6 +91,11 @@
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>mssql-jdbc</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
@ -409,33 +414,6 @@
<version>2.6</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<id>main-class-placement</id>
<phase>generate-resources</phase>
<configuration>
<target>
<move todir="src/main/resources/static">
<fileset dir="../frontend/dist">
<exclude name="*.html"/>
</fileset>
</move>
<move todir="src/main/resources/templates">
<fileset dir="../frontend/dist">
<include name="*.html"/>
</fileset>
</move>
</target>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>

View File

@ -1,5 +1,5 @@
package io.dataease.datasource.constants;
public enum DatasourceTypes {
mysql
mysql, sqlServer
}

View File

@ -0,0 +1,16 @@
package io.dataease.datasource.dto;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class JdbcDTO {
private String host;
private Integer port;
private String username;
private String password;
private String dataBase;
private String dataSourceType = "jdbc";
}

View File

@ -6,20 +6,11 @@ import org.apache.commons.lang3.StringUtils;
@Getter
@Setter
public class MysqlConfigrationDTO {
private String host;
private Integer port;
private String username;
private String password;
private String jdbc;
private String dataBase;
public class MysqlConfigrationDTO extends JdbcDTO {
private String driver = "com.mysql.cj.jdbc.Driver";
public String getJdbc(){
if(StringUtils.isNotEmpty(jdbc)){
return jdbc;
}else {
return "jdbc:mysql://HOSTNAME:PORT/DATABASE".replace("HOSTNAME", host).replace("PORT", port.toString()).replace("DATABASE", dataBase);
}
return "jdbc:mysql://HOSTNAME:PORT/DATABASE".replace("HOSTNAME", getHost()).replace("PORT", getPort().toString()).replace("DATABASE", getDataBase());
}
}

View File

@ -0,0 +1,16 @@
package io.dataease.datasource.dto;
import lombok.Getter;
import lombok.Setter;
import org.apache.commons.lang3.StringUtils;
@Getter
@Setter
public class SqlServerConfigration extends JdbcDTO {
private String driver = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
public String getJdbc(){
return "jdbc:sqlserver://HOSTNAME:PORT;DatabaseName=DATABASE".replace("HOSTNAME", getHost()).replace("PORT", getPort().toString()).replace("DATABASE", getDataBase());
}
}

View File

@ -3,6 +3,7 @@ package io.dataease.datasource.provider;
import com.google.gson.Gson;
import io.dataease.datasource.constants.DatasourceTypes;
import io.dataease.datasource.dto.MysqlConfigrationDTO;
import io.dataease.datasource.dto.SqlServerConfigration;
import io.dataease.datasource.dto.TableFiled;
import io.dataease.datasource.request.DatasourceRequest;
import org.apache.commons.lang3.StringUtils;
@ -13,13 +14,14 @@ import java.util.*;
@Service("jdbc")
public class JdbcProvider extends DatasourceProvider{
@Override
public List<String[]> getData(DatasourceRequest datasourceRequest) throws Exception {
List<String[]> list = new LinkedList<>();
try (
Connection connection = getConnection(datasourceRequest);
Statement stat = connection.createStatement();
ResultSet rs = stat.executeQuery(datasourceRequest.getQuery())
Connection connection = getConnection(datasourceRequest);
Statement stat = connection.createStatement();
ResultSet rs = stat.executeQuery(datasourceRequest.getQuery())
) {
ResultSetMetaData metaData = rs.getMetaData();
int columnCount = metaData.getColumnCount();
@ -49,11 +51,7 @@ public class JdbcProvider extends DatasourceProvider{
@Override
public List<String> getTables(DatasourceRequest datasourceRequest) throws Exception {
List<String> tables = new ArrayList<>();
String queryStr = "show tables";
if(StringUtils.isNotEmpty(datasourceRequest.getQuery())){
queryStr = datasourceRequest.getQuery();
}
String queryStr = getTablesSql(datasourceRequest);
try (Connection con = getConnection(datasourceRequest); Statement ps = con.createStatement()) {
ResultSet resultSet = ps.executeQuery(queryStr);
while (resultSet.next()){
@ -74,7 +72,7 @@ public class JdbcProvider extends DatasourceProvider{
DatabaseMetaData databaseMetaData = connection.getMetaData();
ResultSet resultSet = databaseMetaData.getColumns(null, "%", datasourceRequest.getTable().toUpperCase(), "%");
while (resultSet.next()) {
String tableName=resultSet.getString("TABLE_NAME");
String tableName = resultSet.getString("TABLE_NAME");
String database = resultSet.getString("TABLE_CAT");
if(tableName.equals(datasourceRequest.getTable()) && database.equalsIgnoreCase(getDatabase(datasourceRequest))){
TableFiled tableFiled = new TableFiled();
@ -100,7 +98,7 @@ public class JdbcProvider extends DatasourceProvider{
@Override
public void test(DatasourceRequest datasourceRequest) throws Exception {
String queryStr = "show tables";
String queryStr = getTablesSql(datasourceRequest);
try (Connection con = getConnection(datasourceRequest); Statement ps = con.createStatement()) {
ResultSet resultSet = ps.executeQuery(queryStr);
} catch (Exception e) {
@ -122,6 +120,13 @@ public class JdbcProvider extends DatasourceProvider{
driver = mysqlConfigrationDTO.getDriver();
jdbcurl = mysqlConfigrationDTO.getJdbc();
break;
case sqlServer:
SqlServerConfigration sqlServerConfigration= new Gson().fromJson(datasourceRequest.getDatasource().getConfiguration(), SqlServerConfigration.class);
username = sqlServerConfigration.getUsername();
password = sqlServerConfigration.getPassword();
driver = sqlServerConfigration.getDriver();
jdbcurl = sqlServerConfigration.getJdbc();
break;
default:
break;
}
@ -141,45 +146,23 @@ public class JdbcProvider extends DatasourceProvider{
case mysql:
MysqlConfigrationDTO mysqlConfigrationDTO = new Gson().fromJson(datasourceRequest.getDatasource().getConfiguration(), MysqlConfigrationDTO.class);
return mysqlConfigrationDTO.getDataBase();
case sqlServer:
SqlServerConfigration sqlServerConfigration = new Gson().fromJson(datasourceRequest.getDatasource().getConfiguration(), SqlServerConfigration.class);
return sqlServerConfigration.getDataBase();
default:
return null;
}
}
private static String getSchema(Connection conn) throws Exception {
String schema;
schema = conn.getMetaData().getUserName();
System.out.println(schema);
if ((schema == null) || (schema.length() == 0)) {
throw new Exception("ORACLE数据库模式不允许为空");
}
return schema.toUpperCase().toString();
}
private static String changeDbType(String dbType) {
dbType = dbType.toUpperCase();
switch(dbType){
case "VARCHAR":
case "VARCHAR2":
case "CHAR":
return "1";
case "NUMBER":
case "DECIMAL":
return "4";
case "INT":
case "SMALLINT":
case "INTEGER":
return "2";
case "BIGINT":
return "6";
case "DATETIME":
case "TIMESTAMP":
case "DATE":
return "7";
private String getTablesSql(DatasourceRequest datasourceRequest){
DatasourceTypes datasourceType = DatasourceTypes.valueOf(datasourceRequest.getDatasource().getType());
switch (datasourceType){
case mysql:
return "show tables;";
case sqlServer:
return "SELECT TABLE_NAME FROM fit2cloud2.INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE';";
default:
return "1";
return "show tables;";
}
}
}

View File

@ -19,12 +19,12 @@ public class ProviderFactory implements ApplicationContextAware {
}
public static DatasourceProvider getProvider(String type){
System.out.println(type);
DatasourceTypes datasourceType = DatasourceTypes.valueOf(type);
System.out.println(datasourceType.name());
switch (datasourceType){
case mysql:
return context.getBean("jdbc", DatasourceProvider.class);
case sqlServer:
return context.getBean("jdbc", DatasourceProvider.class);
default:
return context.getBean("jdbc", DatasourceProvider.class);
}

View File

@ -4,7 +4,6 @@ import io.dataease.base.domain.Datasource;
import lombok.Getter;
import lombok.Setter;
import javax.sql.DataSource;
@Getter
@Setter

View File

@ -1,12 +1,9 @@
package io.dataease.datasource.service;
import com.google.gson.Gson;
import io.dataease.base.domain.*;
import io.dataease.base.mapper.*;
import io.dataease.commons.exception.DEException;
import io.dataease.datasource.dto.MysqlConfigrationDTO;
import io.dataease.datasource.provider.DatasourceProvider;
import io.dataease.datasource.provider.JdbcProvider;
import io.dataease.datasource.provider.ProviderFactory;
import io.dataease.datasource.request.DatasourceRequest;
import org.apache.commons.collections.CollectionUtils;
@ -15,10 +12,8 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import java.util.stream.Collectors;
@Service
@Transactional(rollbackFor = Exception.class)

View File

@ -34,29 +34,29 @@
<el-input v-model="form.desc" autocomplete="off" type="textarea"/>
</el-form-item>
<el-form-item :label="$t('datasource.type')" prop="type" :rules="{required: true, message: $t('datasource.please_choose_type'), trigger: 'change'}">
<el-select v-model="form.type" :placeholder="$t('datasource.please_choose_type')" class="select-width">
<el-select v-model="form.type" :placeholder="$t('datasource.please_choose_type')" class="select-width" @change="changeType()">
<el-option
v-for="item in allTypes"
:key="item"
:label="item"
:value="item">
:key="item.name"
:label="item.name"
:value="item.name">
</el-option>
</el-select>
</el-form-item>
<el-form-item :label="$t('datasource.data_base')" prop="configuration.dataBase" :rules="{required: true, message: $t('datasource.please_input_data_base'), trigger: 'blur'}" v-show="form.type=='mysql'">
<el-form-item :label="$t('datasource.data_base')" prop="configuration.dataBase" :rules="{required: true, message: $t('datasource.please_input_data_base'), trigger: 'blur'}" v-show="form.configuration.dataSourceType=='jdbc'">
<el-input v-model="form.configuration.dataBase" autocomplete="off" />
</el-form-item>
<el-form-item :label="$t('datasource.user_name')" prop="configuration.username" v-show="form.type=='mysql'">
<el-form-item :label="$t('datasource.user_name')" prop="configuration.username" v-show="form.configuration.dataSourceType=='jdbc'">
<el-input v-model="form.configuration.username" autocomplete="off" />
</el-form-item>
<el-form-item :label="$t('datasource.password')" prop="configuration.password" :rules="{required: true, message: $t('datasource.please_input_password'), trigger: 'change'}" v-show="form.type=='mysql'">
<el-form-item :label="$t('datasource.password')" prop="configuration.password" :rules="{required: true, message: $t('datasource.please_input_password'), trigger: 'change'}" v-show="form.configuration.dataSourceType=='jdbc'">
<el-input v-model="form.configuration.password" autocomplete="off" />
</el-form-item>
<el-form-item :label="$t('datasource.host')" prop="configuration.host" :rules="{required: true, message: $t('datasource.please_input_host'), trigger: 'change'}" v-show="form.type=='mysql'">
<el-form-item :label="$t('datasource.host')" prop="configuration.host" :rules="{required: true, message: $t('datasource.please_input_host'), trigger: 'change'}" v-show="form.configuration.dataSourceType=='jdbc'">
<el-input v-model="form.configuration.host" autocomplete="off" />
</el-form-item>
<el-form-item :label="$t('datasource.port')" prop="configuration.port" :rules="{required: true, message: $t('datasource.please_input_port'), trigger: 'change'}" v-show="form.type=='mysql'">
<el-form-item :label="$t('datasource.port')" prop="configuration.port" :rules="{required: true, message: $t('datasource.please_input_port'), trigger: 'change'}" v-show="form.configuration.dataSourceType=='jdbc'">
<el-input v-model="form.configuration.port" autocomplete="off" />
</el-form-item>
@ -84,19 +84,19 @@
{min: 2, max: 50, message: this.$t('commons.input_limit', [2, 50]), trigger: 'blur'}]">
<el-input v-model="form.desc" autocomplete="off"/>
</el-form-item>
<el-form-item :label="$t('datasource.data_base')" prop="configuration.dataBase" :rules="{required: true, message: $t('datasource.please_input_data_base'), trigger: 'blur'}" v-show="form.type=='mysql'">
<el-form-item :label="$t('datasource.data_base')" prop="configuration.dataBase" :rules="{required: true, message: $t('datasource.please_input_data_base'), trigger: 'blur'}" v-show="form.configuration.dataSourceType=='jdbc'">
<el-input v-model="form.configuration.dataBase" autocomplete="off" />
</el-form-item>
<el-form-item :label="$t('datasource.user_name')" prop="configuration.username" v-show="form.type=='mysql'">
<el-form-item :label="$t('datasource.user_name')" prop="configuration.username" v-show="form.configuration.dataSourceType=='jdbc'">
<el-input v-model="form.configuration.username" autocomplete="off" />
</el-form-item>
<el-form-item :label="$t('datasource.password')" prop="configuration.password" :rules="{required: true, message: $t('datasource.please_input_password'), trigger: 'change'}" v-show="form.type=='mysql'">
<el-form-item :label="$t('datasource.password')" prop="configuration.password" :rules="{required: true, message: $t('datasource.please_input_password'), trigger: 'change'}" v-show="form.configuration.dataSourceType=='jdbc'">
<el-input v-model="form.configuration.password" autocomplete="off" />
</el-form-item>
<el-form-item :label="$t('datasource.host')" prop="configuration.host" :rules="{required: true, message: $t('datasource.please_input_host'), trigger: 'change'}" v-show="form.type=='mysql'">
<el-form-item :label="$t('datasource.host')" prop="configuration.host" :rules="{required: true, message: $t('datasource.please_input_host'), trigger: 'change'}" v-show="form.configuration.dataSourceType=='jdbc'">
<el-input v-model="form.configuration.host" autocomplete="off" />
</el-form-item>
<el-form-item :label="$t('datasource.port')" prop="configuration.port" :rules="{required: true, message: $t('datasource.please_input_port'), trigger: 'change'}" v-show="form.type=='mysql'">
<el-form-item :label="$t('datasource.port')" prop="configuration.port" :rules="{required: true, message: $t('datasource.please_input_port'), trigger: 'change'}" v-show="form.configuration.dataSourceType=='jdbc'">
<el-input v-model="form.configuration.port" autocomplete="off" />
</el-form-item>
</el-form>
@ -169,7 +169,7 @@
tableData: [],
memberLineData: [],
form: {configuration: {}},
allTypes: ['mysql', 'oracle'],
allTypes: [{name: "mysql", type: "jdbc"}, {name: "sqlServer", type: "jdbc"}],
memberForm: {},
rule: {
name: [
@ -320,6 +320,13 @@
}
})
},
changeType(){
for (let i = 0; i < this.allTypes.length; i++) {
if(this.allTypes[i].name == this.form.type){
this.form.configuration.dataSourceType = this.allTypes[i].type;
}
}
},
initTableData() {
this.result = this.$post(this.queryPath + "/" + this.currentPage + "/" + this.pageSize, this.condition, response => {
let data = response.data;

View File

@ -1573,7 +1573,7 @@ export default {
special_characters_are_not_supported: '格式错误(不支持特殊字符,且不能以\'-\'开头结尾)',
none: '无组织',
select: '选择组织',
delete_warning: '删除该组织将同步删除该组织下所有相关工作空间和相关工作空间下的所有项目,以及项目中的所有用例、接口测试、性能测试等,确定要删除吗?',
delete_warning: '删除该数据连接将同步删除该数据连接下所有相关的数据集, 确定要删除吗?',
service_integration: '服务集成',
defect_manage: '缺陷管理平台',
message_settings: '消息设置',