提交 1c8399ed authored 作者: taojinlong's avatar taojinlong

feat: 支持 SQL Server

上级 0afbbf31
...@@ -91,6 +91,11 @@ ...@@ -91,6 +91,11 @@
<artifactId>mysql-connector-java</artifactId> <artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope> <scope>runtime</scope>
</dependency> </dependency>
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>mssql-jdbc</artifactId>
<scope>runtime</scope>
</dependency>
<dependency> <dependency>
<groupId>com.github.pagehelper</groupId> <groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId> <artifactId>pagehelper</artifactId>
...@@ -409,33 +414,6 @@ ...@@ -409,33 +414,6 @@
<version>2.6</version> <version>2.6</version>
</plugin> </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> <plugin>
<groupId>org.mybatis.generator</groupId> <groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId> <artifactId>mybatis-generator-maven-plugin</artifactId>
......
package io.dataease.datasource.constants; package io.dataease.datasource.constants;
public enum DatasourceTypes { public enum DatasourceTypes {
mysql mysql, sqlServer
} }
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; ...@@ -6,20 +6,11 @@ import org.apache.commons.lang3.StringUtils;
@Getter @Getter
@Setter @Setter
public class MysqlConfigrationDTO { public class MysqlConfigrationDTO extends JdbcDTO {
private String host;
private Integer port;
private String username;
private String password;
private String jdbc;
private String dataBase;
private String driver = "com.mysql.cj.jdbc.Driver"; private String driver = "com.mysql.cj.jdbc.Driver";
public String getJdbc(){ public String getJdbc(){
if(StringUtils.isNotEmpty(jdbc)){ return "jdbc:mysql://HOSTNAME:PORT/DATABASE".replace("HOSTNAME", getHost()).replace("PORT", getPort().toString()).replace("DATABASE", getDataBase());
return jdbc;
}else {
return "jdbc:mysql://HOSTNAME:PORT/DATABASE".replace("HOSTNAME", host).replace("PORT", port.toString()).replace("DATABASE", dataBase);
}
} }
} }
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; ...@@ -3,6 +3,7 @@ package io.dataease.datasource.provider;
import com.google.gson.Gson; import com.google.gson.Gson;
import io.dataease.datasource.constants.DatasourceTypes; import io.dataease.datasource.constants.DatasourceTypes;
import io.dataease.datasource.dto.MysqlConfigrationDTO; import io.dataease.datasource.dto.MysqlConfigrationDTO;
import io.dataease.datasource.dto.SqlServerConfigration;
import io.dataease.datasource.dto.TableFiled; import io.dataease.datasource.dto.TableFiled;
import io.dataease.datasource.request.DatasourceRequest; import io.dataease.datasource.request.DatasourceRequest;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
...@@ -13,13 +14,14 @@ import java.util.*; ...@@ -13,13 +14,14 @@ import java.util.*;
@Service("jdbc") @Service("jdbc")
public class JdbcProvider extends DatasourceProvider{ public class JdbcProvider extends DatasourceProvider{
@Override @Override
public List<String[]> getData(DatasourceRequest datasourceRequest) throws Exception { public List<String[]> getData(DatasourceRequest datasourceRequest) throws Exception {
List<String[]> list = new LinkedList<>(); List<String[]> list = new LinkedList<>();
try ( try (
Connection connection = getConnection(datasourceRequest); Connection connection = getConnection(datasourceRequest);
Statement stat = connection.createStatement(); Statement stat = connection.createStatement();
ResultSet rs = stat.executeQuery(datasourceRequest.getQuery()) ResultSet rs = stat.executeQuery(datasourceRequest.getQuery())
) { ) {
ResultSetMetaData metaData = rs.getMetaData(); ResultSetMetaData metaData = rs.getMetaData();
int columnCount = metaData.getColumnCount(); int columnCount = metaData.getColumnCount();
...@@ -49,11 +51,7 @@ public class JdbcProvider extends DatasourceProvider{ ...@@ -49,11 +51,7 @@ public class JdbcProvider extends DatasourceProvider{
@Override @Override
public List<String> getTables(DatasourceRequest datasourceRequest) throws Exception { public List<String> getTables(DatasourceRequest datasourceRequest) throws Exception {
List<String> tables = new ArrayList<>(); List<String> tables = new ArrayList<>();
String queryStr = getTablesSql(datasourceRequest);
String queryStr = "show tables";
if(StringUtils.isNotEmpty(datasourceRequest.getQuery())){
queryStr = datasourceRequest.getQuery();
}
try (Connection con = getConnection(datasourceRequest); Statement ps = con.createStatement()) { try (Connection con = getConnection(datasourceRequest); Statement ps = con.createStatement()) {
ResultSet resultSet = ps.executeQuery(queryStr); ResultSet resultSet = ps.executeQuery(queryStr);
while (resultSet.next()){ while (resultSet.next()){
...@@ -74,7 +72,7 @@ public class JdbcProvider extends DatasourceProvider{ ...@@ -74,7 +72,7 @@ public class JdbcProvider extends DatasourceProvider{
DatabaseMetaData databaseMetaData = connection.getMetaData(); DatabaseMetaData databaseMetaData = connection.getMetaData();
ResultSet resultSet = databaseMetaData.getColumns(null, "%", datasourceRequest.getTable().toUpperCase(), "%"); ResultSet resultSet = databaseMetaData.getColumns(null, "%", datasourceRequest.getTable().toUpperCase(), "%");
while (resultSet.next()) { while (resultSet.next()) {
String tableName=resultSet.getString("TABLE_NAME"); String tableName = resultSet.getString("TABLE_NAME");
String database = resultSet.getString("TABLE_CAT"); String database = resultSet.getString("TABLE_CAT");
if(tableName.equals(datasourceRequest.getTable()) && database.equalsIgnoreCase(getDatabase(datasourceRequest))){ if(tableName.equals(datasourceRequest.getTable()) && database.equalsIgnoreCase(getDatabase(datasourceRequest))){
TableFiled tableFiled = new TableFiled(); TableFiled tableFiled = new TableFiled();
...@@ -100,7 +98,7 @@ public class JdbcProvider extends DatasourceProvider{ ...@@ -100,7 +98,7 @@ public class JdbcProvider extends DatasourceProvider{
@Override @Override
public void test(DatasourceRequest datasourceRequest) throws Exception { public void test(DatasourceRequest datasourceRequest) throws Exception {
String queryStr = "show tables"; String queryStr = getTablesSql(datasourceRequest);
try (Connection con = getConnection(datasourceRequest); Statement ps = con.createStatement()) { try (Connection con = getConnection(datasourceRequest); Statement ps = con.createStatement()) {
ResultSet resultSet = ps.executeQuery(queryStr); ResultSet resultSet = ps.executeQuery(queryStr);
} catch (Exception e) { } catch (Exception e) {
...@@ -122,6 +120,13 @@ public class JdbcProvider extends DatasourceProvider{ ...@@ -122,6 +120,13 @@ public class JdbcProvider extends DatasourceProvider{
driver = mysqlConfigrationDTO.getDriver(); driver = mysqlConfigrationDTO.getDriver();
jdbcurl = mysqlConfigrationDTO.getJdbc(); jdbcurl = mysqlConfigrationDTO.getJdbc();
break; 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: default:
break; break;
} }
...@@ -141,45 +146,23 @@ public class JdbcProvider extends DatasourceProvider{ ...@@ -141,45 +146,23 @@ public class JdbcProvider extends DatasourceProvider{
case mysql: case mysql:
MysqlConfigrationDTO mysqlConfigrationDTO = new Gson().fromJson(datasourceRequest.getDatasource().getConfiguration(), MysqlConfigrationDTO.class); MysqlConfigrationDTO mysqlConfigrationDTO = new Gson().fromJson(datasourceRequest.getDatasource().getConfiguration(), MysqlConfigrationDTO.class);
return mysqlConfigrationDTO.getDataBase(); return mysqlConfigrationDTO.getDataBase();
case sqlServer:
SqlServerConfigration sqlServerConfigration = new Gson().fromJson(datasourceRequest.getDatasource().getConfiguration(), SqlServerConfigration.class);
return sqlServerConfigration.getDataBase();
default: default:
return null; return null;
} }
} }
private static String getSchema(Connection conn) throws Exception { private String getTablesSql(DatasourceRequest datasourceRequest){
String schema; DatasourceTypes datasourceType = DatasourceTypes.valueOf(datasourceRequest.getDatasource().getType());
schema = conn.getMetaData().getUserName(); switch (datasourceType){
System.out.println(schema); case mysql:
if ((schema == null) || (schema.length() == 0)) { return "show tables;";
throw new Exception("ORACLE数据库模式不允许为空"); case sqlServer:
} return "SELECT TABLE_NAME FROM fit2cloud2.INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE';";
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";
default: default:
return "1"; return "show tables;";
} }
} }
} }
...@@ -19,12 +19,12 @@ public class ProviderFactory implements ApplicationContextAware { ...@@ -19,12 +19,12 @@ public class ProviderFactory implements ApplicationContextAware {
} }
public static DatasourceProvider getProvider(String type){ public static DatasourceProvider getProvider(String type){
System.out.println(type);
DatasourceTypes datasourceType = DatasourceTypes.valueOf(type); DatasourceTypes datasourceType = DatasourceTypes.valueOf(type);
System.out.println(datasourceType.name());
switch (datasourceType){ switch (datasourceType){
case mysql: case mysql:
return context.getBean("jdbc", DatasourceProvider.class); return context.getBean("jdbc", DatasourceProvider.class);
case sqlServer:
return context.getBean("jdbc", DatasourceProvider.class);
default: default:
return context.getBean("jdbc", DatasourceProvider.class); return context.getBean("jdbc", DatasourceProvider.class);
} }
......
...@@ -4,7 +4,6 @@ import io.dataease.base.domain.Datasource; ...@@ -4,7 +4,6 @@ import io.dataease.base.domain.Datasource;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
import javax.sql.DataSource;
@Getter @Getter
@Setter @Setter
......
package io.dataease.datasource.service; package io.dataease.datasource.service;
import com.google.gson.Gson;
import io.dataease.base.domain.*; import io.dataease.base.domain.*;
import io.dataease.base.mapper.*; import io.dataease.base.mapper.*;
import io.dataease.commons.exception.DEException; import io.dataease.commons.exception.DEException;
import io.dataease.datasource.dto.MysqlConfigrationDTO;
import io.dataease.datasource.provider.DatasourceProvider; import io.dataease.datasource.provider.DatasourceProvider;
import io.dataease.datasource.provider.JdbcProvider;
import io.dataease.datasource.provider.ProviderFactory; import io.dataease.datasource.provider.ProviderFactory;
import io.dataease.datasource.request.DatasourceRequest; import io.dataease.datasource.request.DatasourceRequest;
import org.apache.commons.collections.CollectionUtils; import org.apache.commons.collections.CollectionUtils;
...@@ -15,10 +12,8 @@ import org.springframework.stereotype.Service; ...@@ -15,10 +12,8 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.UUID; import java.util.UUID;
import java.util.stream.Collectors;
@Service @Service
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
......
...@@ -34,29 +34,29 @@ ...@@ -34,29 +34,29 @@
<el-input v-model="form.desc" autocomplete="off" type="textarea"/> <el-input v-model="form.desc" autocomplete="off" type="textarea"/>
</el-form-item> </el-form-item>
<el-form-item :label="$t('datasource.type')" prop="type" :rules="{required: true, message: $t('datasource.please_choose_type'), trigger: 'change'}"> <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 <el-option
v-for="item in allTypes" v-for="item in allTypes"
:key="item" :key="item.name"
:label="item" :label="item.name"
:value="item"> :value="item.name">
</el-option> </el-option>
</el-select> </el-select>
</el-form-item> </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-input v-model="form.configuration.dataBase" autocomplete="off" />
</el-form-item> </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-input v-model="form.configuration.username" autocomplete="off" />
</el-form-item> </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-input v-model="form.configuration.password" autocomplete="off" />
</el-form-item> </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-input v-model="form.configuration.host" autocomplete="off" />
</el-form-item> </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-input v-model="form.configuration.port" autocomplete="off" />
</el-form-item> </el-form-item>
...@@ -84,19 +84,19 @@ ...@@ -84,19 +84,19 @@
{min: 2, max: 50, message: this.$t('commons.input_limit', [2, 50]), trigger: 'blur'}]"> {min: 2, max: 50, message: this.$t('commons.input_limit', [2, 50]), trigger: 'blur'}]">
<el-input v-model="form.desc" autocomplete="off"/> <el-input v-model="form.desc" autocomplete="off"/>
</el-form-item> </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-input v-model="form.configuration.dataBase" autocomplete="off" />
</el-form-item> </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-input v-model="form.configuration.username" autocomplete="off" />
</el-form-item> </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-input v-model="form.configuration.password" autocomplete="off" />
</el-form-item> </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-input v-model="form.configuration.host" autocomplete="off" />
</el-form-item> </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-input v-model="form.configuration.port" autocomplete="off" />
</el-form-item> </el-form-item>
</el-form> </el-form>
...@@ -169,7 +169,7 @@ ...@@ -169,7 +169,7 @@
tableData: [], tableData: [],
memberLineData: [], memberLineData: [],
form: {configuration: {}}, form: {configuration: {}},
allTypes: ['mysql', 'oracle'], allTypes: [{name: "mysql", type: "jdbc"}, {name: "sqlServer", type: "jdbc"}],
memberForm: {}, memberForm: {},
rule: { rule: {
name: [ name: [
...@@ -320,6 +320,13 @@ ...@@ -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() { initTableData() {
this.result = this.$post(this.queryPath + "/" + this.currentPage + "/" + this.pageSize, this.condition, response => { this.result = this.$post(this.queryPath + "/" + this.currentPage + "/" + this.pageSize, this.condition, response => {
let data = response.data; let data = response.data;
......
...@@ -1573,7 +1573,7 @@ export default { ...@@ -1573,7 +1573,7 @@ export default {
special_characters_are_not_supported: '格式错误(不支持特殊字符,且不能以\'-\'开头结尾)', special_characters_are_not_supported: '格式错误(不支持特殊字符,且不能以\'-\'开头结尾)',
none: '无组织', none: '无组织',
select: '选择组织', select: '选择组织',
delete_warning: '删除该组织将同步删除该组织下所有相关工作空间和相关工作空间下的所有项目,以及项目中的所有用例、接口测试、性能测试等,确定要删除吗?', delete_warning: '删除该数据连接将同步删除该数据连接下所有相关的数据集, 确定要删除吗?',
service_integration: '服务集成', service_integration: '服务集成',
defect_manage: '缺陷管理平台', defect_manage: '缺陷管理平台',
message_settings: '消息设置', message_settings: '消息设置',
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论