forked from github/dataease
feat: 支持 SQL Server
This commit is contained in:
parent
0afbbf3174
commit
1c8399ed26
@ -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>
|
||||
|
@ -1,5 +1,5 @@
|
||||
package io.dataease.datasource.constants;
|
||||
|
||||
public enum DatasourceTypes {
|
||||
mysql
|
||||
mysql, sqlServer
|
||||
}
|
||||
|
@ -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";
|
||||
}
|
@ -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());
|
||||
}
|
||||
}
|
||||
|
@ -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());
|
||||
}
|
||||
}
|
@ -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;";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -4,7 +4,6 @@ import io.dataease.base.domain.Datasource;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
||||
import javax.sql.DataSource;
|
||||
|
||||
@Getter
|
||||
@Setter
|
||||
|
@ -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)
|
||||
|
@ -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;
|
||||
|
@ -1573,7 +1573,7 @@ export default {
|
||||
special_characters_are_not_supported: '格式错误(不支持特殊字符,且不能以\'-\'开头结尾)',
|
||||
none: '无组织',
|
||||
select: '选择组织',
|
||||
delete_warning: '删除该组织将同步删除该组织下所有相关工作空间和相关工作空间下的所有项目,以及项目中的所有用例、接口测试、性能测试等,确定要删除吗?',
|
||||
delete_warning: '删除该数据连接将同步删除该数据连接下所有相关的数据集, 确定要删除吗?',
|
||||
service_integration: '服务集成',
|
||||
defect_manage: '缺陷管理平台',
|
||||
message_settings: '消息设置',
|
||||
|
Loading…
Reference in New Issue
Block a user