Commit fb67c15e by yuwei

项目初始化

parent 7d6f4e3c
...@@ -16,6 +16,31 @@ ...@@ -16,6 +16,31 @@
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId> <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency> </dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<dependency>
<groupId>org.mariadb.jdbc</groupId>
<artifactId>mariadb-java-client</artifactId>
<version>${mariadb.version}</version>
</dependency>
<dependency>
<groupId>com.oracle.ojdbc</groupId>
<artifactId>ojdbc8</artifactId>
<version>${oracle.version}</version>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>${postgresql.version}</version>
</dependency>
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>mssql-jdbc</artifactId>
<version>${sqlserver.version}</version>
</dependency>
</dependencies> </dependencies>
</project> </project>
\ No newline at end of file
...@@ -3,7 +3,7 @@ package cn.datax.common.database.constants; ...@@ -3,7 +3,7 @@ package cn.datax.common.database.constants;
import cn.datax.common.database.exception.DataQueryException; import cn.datax.common.database.exception.DataQueryException;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import org.apache.commons.lang.StringUtils; import org.springframework.util.StringUtils;
import java.io.Serializable; import java.io.Serializable;
...@@ -14,15 +14,19 @@ public class DbQueryProperty implements Serializable { ...@@ -14,15 +14,19 @@ public class DbQueryProperty implements Serializable {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
private String dbType; private String dbType;
private String jdbcUrl; private String host;
private String username; private String username;
private String password; private String password;
private Integer port;
private String dbName;
/** /**
* 参数合法性校验 * 参数合法性校验
*/ */
public void viald() { public void viald() {
if (StringUtils.isEmpty(jdbcUrl) || StringUtils.isEmpty(username) || StringUtils.isEmpty(password)) { if (StringUtils.isEmpty(dbType) || StringUtils.isEmpty(host) ||
StringUtils.isEmpty(username) || StringUtils.isEmpty(password) ||
StringUtils.isEmpty(port) || StringUtils.isEmpty(dbName)) {
throw new DataQueryException("参数不完整"); throw new DataQueryException("参数不完整");
} }
if (DbType.OTHER.getDb().equals(dbType)) { if (DbType.OTHER.getDb().equals(dbType)) {
......
...@@ -11,35 +11,35 @@ public enum DbType { ...@@ -11,35 +11,35 @@ public enum DbType {
/** /**
* MYSQL * MYSQL
*/ */
MYSQL("mysql", "MySql数据库"), MYSQL("mysql", "MySql数据库", "jdbc:mysql://${host}:${port}/${dbName}?serverTimezone=GMT%2B8&characterEncoding=UTF-8&useUnicode=true&useSSL=false"),
/** /**
* MARIADB * MARIADB
*/ */
MARIADB("mariadb", "MariaDB数据库"), MARIADB("mariadb", "MariaDB数据库", "jdbc:mariadb://${host}:${port}/${dbName}"),
/** /**
* ORACLE * ORACLE
*/ */
ORACLE("oracle", "Oracle11g及以下数据库"), ORACLE("oracle", "Oracle11g及以下数据库", "jdbc:oracle:thin:@${host}:${port}:${dbName}"),
/** /**
* oracle12c new pagination * oracle12c new pagination
*/ */
ORACLE_12C("oracle12c", "Oracle12c+数据库"), ORACLE_12C("oracle12c", "Oracle12c+数据库", "jdbc:oracle:thin:@${host}:${port}:${dbName}"),
/** /**
* POSTGRE * POSTGRE
*/ */
POSTGRE_SQL("postgresql", "Postgre数据库"), POSTGRE_SQL("postgresql", "Postgre数据库", "jdbc:postgresql://${host}:${port}/${dbName}"),
/** /**
* SQLSERVER2005 * SQLSERVER2005
*/ */
SQL_SERVER2005("sqlserver2005", "SQLServer2005数据库"), SQL_SERVER2008("sqlserver2008", "SQLServer2008及以下数据库", "jdbc:sqlserver://${host}:${port};DatabaseName=${dbName}"),
/** /**
* SQLSERVER * SQLSERVER
*/ */
SQL_SERVER("sqlserver", "SQLServer2012+数据库"), SQL_SERVER("sqlserver", "SQLServer2012+数据库", "jdbc:sqlserver://${host}:${port};DatabaseName=${dbName}"),
/** /**
* UNKONWN DB * UNKONWN DB
*/ */
OTHER("other", "其他数据库"); OTHER("other", "其他数据库", "");
/** /**
* 数据库名称 * 数据库名称
...@@ -51,6 +51,11 @@ public enum DbType { ...@@ -51,6 +51,11 @@ public enum DbType {
*/ */
private final String desc; private final String desc;
/**
* url
*/
private final String url;
public String getDb() { public String getDb() {
return this.db; return this.db;
} }
...@@ -59,9 +64,14 @@ public enum DbType { ...@@ -59,9 +64,14 @@ public enum DbType {
return this.desc; return this.desc;
} }
DbType(String db, String desc) { public String getUrl() {
return this.url;
}
DbType(String db, String desc, String url) {
this.db = db; this.db = db;
this.desc = desc; this.desc = desc;
this.url = url;
} }
/** /**
......
...@@ -17,9 +17,7 @@ public class PageResult<T> implements Serializable { ...@@ -17,9 +17,7 @@ public class PageResult<T> implements Serializable {
private long total; private long total;
private List<T> data; private List<T> data;
public PageResult(long pageNum, long pageSize, long total, List<T> data) { public PageResult(long total, List<T> data) {
this.pageNum = pageNum;
this.pageSize = pageSize;
this.total = total; this.total = total;
this.data = data; this.data = data;
} }
......
...@@ -7,6 +7,7 @@ import cn.datax.common.database.exception.DataQueryException; ...@@ -7,6 +7,7 @@ import cn.datax.common.database.exception.DataQueryException;
import cn.datax.common.database.query.AbstractDbQuery; import cn.datax.common.database.query.AbstractDbQuery;
import com.zaxxer.hikari.HikariDataSource; import com.zaxxer.hikari.HikariDataSource;
import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.util.StringUtils;
import javax.sql.DataSource; import javax.sql.DataSource;
...@@ -35,9 +36,23 @@ public abstract class AbstractDataSourceFactory implements DataSourceFactory { ...@@ -35,9 +36,23 @@ public abstract class AbstractDataSourceFactory implements DataSourceFactory {
public DataSource createDataSource(DbQueryProperty property) { public DataSource createDataSource(DbQueryProperty property) {
HikariDataSource dataSource = new HikariDataSource(); HikariDataSource dataSource = new HikariDataSource();
dataSource.setJdbcUrl(property.getJdbcUrl()); dataSource.setJdbcUrl(trainToJdbcUrl(property));
dataSource.setUsername(property.getUsername()); dataSource.setUsername(property.getUsername());
dataSource.setPassword(property.getPassword()); dataSource.setPassword(property.getPassword());
return dataSource; return dataSource;
} }
protected String trainToJdbcUrl(DbQueryProperty property) {
String url = DbType.getDbType(property.getDbType()).getUrl();
if (StringUtils.isEmpty(url)) {
throw new DataQueryException("无效数据库类型!");
}
url = url.replace("${host}", property.getHost());
url = url.replace("${port}", String.valueOf(property.getPort()));
if (null == property.getDbName()){
property.setDbName("");
}
url = url.replace("${dbName}", property.getDbName());
return url;
}
} }
...@@ -17,7 +17,7 @@ public class CacheDataSourceFactoryBean extends AbstractDataSourceFactory { ...@@ -17,7 +17,7 @@ public class CacheDataSourceFactoryBean extends AbstractDataSourceFactory {
@Override @Override
public DataSource createDataSource(DbQueryProperty property) { public DataSource createDataSource(DbQueryProperty property) {
String key = property.getJdbcUrl() + ":" + property.getUsername(); String key = property.getHost() + ":" + property.getPort() + ":" + property.getUsername()+ ":" + property.getDbName();
String s = compress(key); String s = compress(key);
DataSource dataSource = dataSourceMap.get(s); DataSource dataSource = dataSourceMap.get(s);
if (null == dataSource) { if (null == dataSource) {
...@@ -45,7 +45,7 @@ public class CacheDataSourceFactoryBean extends AbstractDataSourceFactory { ...@@ -45,7 +45,7 @@ public class CacheDataSourceFactoryBean extends AbstractDataSourceFactory {
md.update(str.getBytes()); md.update(str.getBytes());
byte b[] = md.digest(); byte b[] = md.digest();
int i; int i;
StringBuffer buf = new StringBuffer(""); StringBuffer buf = new StringBuffer();
for (int offset = 0; offset < b.length; offset++) { for (int offset = 0; offset < b.length; offset++) {
i = b[offset]; i = b[offset];
if (i < 0) if (i < 0)
......
...@@ -16,7 +16,7 @@ public class DialectRegistry { ...@@ -16,7 +16,7 @@ public class DialectRegistry {
dialect_enum_map.put(DbType.ORACLE_12C, new Oracle12cDialect()); dialect_enum_map.put(DbType.ORACLE_12C, new Oracle12cDialect());
dialect_enum_map.put(DbType.ORACLE, new OracleDialect()); dialect_enum_map.put(DbType.ORACLE, new OracleDialect());
dialect_enum_map.put(DbType.POSTGRE_SQL, new PostgreDialect()); dialect_enum_map.put(DbType.POSTGRE_SQL, new PostgreDialect());
dialect_enum_map.put(DbType.SQL_SERVER2005, new SQLServer2005Dialect()); dialect_enum_map.put(DbType.SQL_SERVER2008, new SQLServer2008Dialect());
dialect_enum_map.put(DbType.SQL_SERVER, new SQLServerDialect()); dialect_enum_map.put(DbType.SQL_SERVER, new SQLServerDialect());
dialect_enum_map.put(DbType.OTHER, new UnknownDialect()); dialect_enum_map.put(DbType.OTHER, new UnknownDialect());
} }
......
...@@ -12,7 +12,7 @@ import java.sql.ResultSet; ...@@ -12,7 +12,7 @@ import java.sql.ResultSet;
* @author yuwei * @author yuwei
* @since 2020-03-14 * @since 2020-03-14
*/ */
public class SQLServer2005Dialect extends AbstractDbDialect { public class SQLServer2008Dialect extends AbstractDbDialect {
@Override @Override
public String columns(String tableName) { public String columns(String tableName) {
......
...@@ -6,7 +6,7 @@ package cn.datax.common.database.dialect; ...@@ -6,7 +6,7 @@ package cn.datax.common.database.dialect;
* @author yuwei * @author yuwei
* @since 2020-03-14 * @since 2020-03-14
*/ */
public class SQLServerDialect extends SQLServer2005Dialect { public class SQLServerDialect extends SQLServer2008Dialect {
@Override @Override
public String buildPaginationSql(String originalSql, long offset, long count) { public String buildPaginationSql(String originalSql, long offset, long count) {
......
...@@ -69,6 +69,6 @@ public abstract class AbstractDbQuery implements DbQuery { ...@@ -69,6 +69,6 @@ public abstract class AbstractDbQuery implements DbQuery {
int total = count(sql); int total = count(sql);
String pageSql = dbDialect.buildPaginationSql(sql, offset, size); String pageSql = dbDialect.buildPaginationSql(sql, offset, size);
List<Map<String, Object>> records = jdbcTemplate.queryForList(pageSql); List<Map<String, Object>> records = jdbcTemplate.queryForList(pageSql);
return new PageResult<>(offset, size, total, records); return new PageResult<>(total, records);
} }
} }
...@@ -16,7 +16,7 @@ public class QueryRegistry { ...@@ -16,7 +16,7 @@ public class QueryRegistry {
query_enum_map.put(DbType.ORACLE_12C, new Oracle12cQuery()); query_enum_map.put(DbType.ORACLE_12C, new Oracle12cQuery());
query_enum_map.put(DbType.ORACLE, new OracleQuery()); query_enum_map.put(DbType.ORACLE, new OracleQuery());
query_enum_map.put(DbType.POSTGRE_SQL, new PostgreQuery()); query_enum_map.put(DbType.POSTGRE_SQL, new PostgreQuery());
query_enum_map.put(DbType.SQL_SERVER2005, new SQLServer2005Query()); query_enum_map.put(DbType.SQL_SERVER2008, new SQLServer2008Query());
query_enum_map.put(DbType.SQL_SERVER, new SQLServerQuery()); query_enum_map.put(DbType.SQL_SERVER, new SQLServerQuery());
query_enum_map.put(DbType.OTHER, new UnknownQuery()); query_enum_map.put(DbType.OTHER, new UnknownQuery());
} }
......
package cn.datax.common.database.query; package cn.datax.common.database.query;
public class SQLServer2005Query extends AbstractDbQuery { public class SQLServer2008Query extends AbstractDbQuery {
} }
...@@ -6,6 +6,7 @@ import io.swagger.annotations.ApiModelProperty; ...@@ -6,6 +6,7 @@ import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.io.Serializable; import java.io.Serializable;
@ApiModel(value = "数据源连接信息Model") @ApiModel(value = "数据源连接信息Model")
...@@ -14,9 +15,15 @@ public class DbSchemaDto implements Serializable { ...@@ -14,9 +15,15 @@ public class DbSchemaDto implements Serializable {
private static final long serialVersionUID=1L; private static final long serialVersionUID=1L;
@ApiModelProperty(value = "JDBC URL") @ApiModelProperty(value = "主机")
@NotBlank(message = "JDBC URL不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class}) @NotBlank(message = "主机不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
private String jdbcUrl; private String host;
@ApiModelProperty(value = "端口")
@NotNull(message = "端口不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
private Integer port;
@ApiModelProperty(value = "数据库")
@NotBlank(message = "数据库不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
private String dbName;
@ApiModelProperty(value = "用户名") @ApiModelProperty(value = "用户名")
@NotBlank(message = "用户名不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class}) @NotBlank(message = "用户名不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
private String username; private String username;
......
...@@ -9,7 +9,9 @@ public class DbSchema implements Serializable { ...@@ -9,7 +9,9 @@ public class DbSchema implements Serializable {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
private String jdbcUrl; private String host;
private String username; private String username;
private String password; private String password;
private Integer port;
private String dbName;
} }
...@@ -17,4 +17,6 @@ import lombok.EqualsAndHashCode; ...@@ -17,4 +17,6 @@ import lombok.EqualsAndHashCode;
public class DataSourceQuery extends BaseQueryParams { public class DataSourceQuery extends BaseQueryParams {
private static final long serialVersionUID=1L; private static final long serialVersionUID=1L;
private String sourceName;
} }
package cn.datax.service.data.factory.api.query;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import java.io.Serializable;
/**
* <p>
* 数据查询 查询实体
* </p>
*
* @author yuwei
* @since 2020-03-14
*/
@Data
public class DbDataQuery implements Serializable {
private static final long serialVersionUID = 1L;
@NotBlank(message = "数据源不能为空")
private String dataSourceId;
@NotBlank(message = "查询sql不能为空")
private String sql;
// 当前页码
private Integer pageNum = 1;
// 分页条数
private Integer pageSize = 20;
public Integer getOffset() {
pageSize = pageSize == null ? 20 : pageSize;
pageNum = pageNum == null ? 1 : pageNum;
int offset = pageNum > 0 ? (pageNum - 1) * pageSize : 0;
return offset;
}
}
...@@ -3,10 +3,13 @@ package cn.datax.service.data.factory.controller; ...@@ -3,10 +3,13 @@ package cn.datax.service.data.factory.controller;
import cn.datax.common.core.JsonPage; import cn.datax.common.core.JsonPage;
import cn.datax.common.core.R; import cn.datax.common.core.R;
import cn.datax.common.database.DbQuery; import cn.datax.common.database.DbQuery;
import cn.datax.common.database.core.DbColumn;
import cn.datax.common.database.core.PageResult;
import cn.datax.common.validate.ValidationGroups; import cn.datax.common.validate.ValidationGroups;
import cn.datax.service.data.factory.api.dto.DataSourceDto; import cn.datax.service.data.factory.api.dto.DataSourceDto;
import cn.datax.service.data.factory.api.entity.DataSourceEntity; import cn.datax.service.data.factory.api.entity.DataSourceEntity;
import cn.datax.service.data.factory.api.query.DataSourceQuery; import cn.datax.service.data.factory.api.query.DataSourceQuery;
import cn.datax.service.data.factory.api.query.DbDataQuery;
import cn.datax.service.data.factory.api.vo.DataSourceVo; import cn.datax.service.data.factory.api.vo.DataSourceVo;
import cn.datax.service.data.factory.mapstruct.DataSourceMapper; import cn.datax.service.data.factory.mapstruct.DataSourceMapper;
import cn.datax.service.data.factory.service.DataSourceService; import cn.datax.service.data.factory.service.DataSourceService;
...@@ -148,7 +151,62 @@ public class DataSourceController extends BaseController { ...@@ -148,7 +151,62 @@ public class DataSourceController extends BaseController {
valid = dbQuery.valid(); valid = dbQuery.valid();
} catch (SQLException e) { } catch (SQLException e) {
e.printStackTrace(); e.printStackTrace();
return R.error(e.getMessage());
} }
return valid ? R.ok() : R.error("数据库连接有误,请检查数据库配置是否正确"); return valid ? R.ok() : R.error("数据库连接有误,请检查数据库配置是否正确");
} }
/**
* 数据库表
* @param id
* @return
*/
@ApiOperation(value = "数据库表", notes = "根据数据源的id来获取指定数据库表")
@ApiImplicitParams({
@ApiImplicitParam(name = "id", value = "ID", required = true, dataType = "String", paramType = "path"),
@ApiImplicitParam(name = "dbName", value = "数据库表名", required = true, dataType = "String", paramType = "path")
})
@GetMapping("/{id}/{dbName}/tables")
public R getDbTables(@PathVariable String id, @PathVariable String dbName) {
DbQuery dbQuery = dataSourceService.getDbTables(id);
List<String> tables = dbQuery.getTables(dbName);
return R.ok().setData(tables);
}
/**
* 数据库表结构
* @param id
* @return
*/
@ApiOperation(value = "数据库表结构", notes = "根据数据源的id来获取指定数据库表的表结构")
@ApiImplicitParams({
@ApiImplicitParam(name = "id", value = "ID", required = true, dataType = "String", paramType = "path"),
@ApiImplicitParam(name = "dbName", value = "数据库名", required = true, dataType = "String", paramType = "path"),
@ApiImplicitParam(name = "tableName", value = "数据表名", required = true, dataType = "String", paramType = "path")
})
@GetMapping("/{id}/{dbName}/{tableName}/columns")
public R getDbTableColumns(@PathVariable String id, @PathVariable String dbName, @PathVariable String tableName) {
DbQuery dbQuery = dataSourceService.getDbTables(id);
List<DbColumn> columns = dbQuery.getTableColumns(dbName, tableName);
return R.ok().setData(columns);
}
@ApiOperation(value = "获取SQL结果", notes = "根据数据源的id来获取SQL结果")
@ApiImplicitParam(name = "dbDataQuery", value = "详细实体dbDataQuery", required = true, dataType = "DbDataQuery")
@GetMapping("/queryList")
public R queryList(@RequestBody @Validated DbDataQuery dbDataQuery) {
DbQuery dbQuery = dataSourceService.getDbTables(dbDataQuery.getDataSourceId());
List<Map<String, Object>> list = dbQuery.queryList(dbDataQuery.getSql());
return R.ok().setData(list);
}
@ApiOperation(value = "分页获取SQL结果", notes = "根据数据源的id来分页获取SQL结果")
@ApiImplicitParam(name = "dbDataQuery", value = "详细实体dbDataQuery", required = true, dataType = "DbDataQuery")
@GetMapping("/queryByPage")
public R queryByPage(@RequestBody @Validated DbDataQuery dbDataQuery) {
DbQuery dbQuery = dataSourceService.getDbTables(dbDataQuery.getDataSourceId());
PageResult<Map<String, Object>> page = dbQuery.queryByPage(dbDataQuery.getSql(), dbDataQuery.getOffset(), dbDataQuery.getPageSize());
page.setPageNum(dbDataQuery.getPageNum()).setPageSize(dbDataQuery.getPageSize());
return R.ok().setData(page);
}
} }
...@@ -27,4 +27,6 @@ public interface DataSourceService extends BaseService<DataSourceEntity> { ...@@ -27,4 +27,6 @@ public interface DataSourceService extends BaseService<DataSourceEntity> {
DbQuery checkConnection(DataSourceDto dataSource); DbQuery checkConnection(DataSourceDto dataSource);
List<Map<String, Object>> getDbTypes(); List<Map<String, Object>> getDbTypes();
DbQuery getDbTables(String id);
} }
...@@ -67,7 +67,8 @@ public class DataSourceServiceImpl extends BaseServiceImpl<DataSourceDao, DataSo ...@@ -67,7 +67,8 @@ public class DataSourceServiceImpl extends BaseServiceImpl<DataSourceDao, DataSo
public DbQuery checkConnection(DataSourceDto dataSourceDto) { public DbQuery checkConnection(DataSourceDto dataSourceDto) {
DataSourceEntity dataSource = dataSourceMapper.toEntity(dataSourceDto); DataSourceEntity dataSource = dataSourceMapper.toEntity(dataSourceDto);
DbSchema dbSchema = dataSource.getDbSchema(); DbSchema dbSchema = dataSource.getDbSchema();
DbQueryProperty dbQueryProperty = new DbQueryProperty(dataSource.getDbType(), dbSchema.getJdbcUrl(), dbSchema.getUsername(), dbSchema.getPassword()); DbQueryProperty dbQueryProperty = new DbQueryProperty(dataSource.getDbType(), dbSchema.getHost(),
dbSchema.getUsername(), dbSchema.getPassword(), dbSchema.getPort(), dbSchema.getDbName());
DbQuery dbQuery = dataSourceFactory.createDbQuery(dbQueryProperty); DbQuery dbQuery = dataSourceFactory.createDbQuery(dbQueryProperty);
return dbQuery; return dbQuery;
} }
...@@ -81,4 +82,14 @@ public class DataSourceServiceImpl extends BaseServiceImpl<DataSourceDao, DataSo ...@@ -81,4 +82,14 @@ public class DataSourceServiceImpl extends BaseServiceImpl<DataSourceDao, DataSo
return map; return map;
}).collect(Collectors.toList()); }).collect(Collectors.toList());
} }
@Override
public DbQuery getDbTables(String id) {
DataSourceEntity dataSource = getById(id);
DbSchema dbSchema = dataSource.getDbSchema();
DbQueryProperty dbQueryProperty = new DbQueryProperty(dataSource.getDbType(), dbSchema.getHost(),
dbSchema.getUsername(), dbSchema.getPassword(), dbSchema.getPort(), dbSchema.getDbName());
DbQuery dbQuery = dataSourceFactory.createDbQuery(dbQueryProperty);
return dbQuery;
}
} }
...@@ -42,6 +42,11 @@ ...@@ -42,6 +42,11 @@
<aliyun-sdk-oss.version>3.6.0</aliyun-sdk-oss.version> <aliyun-sdk-oss.version>3.6.0</aliyun-sdk-oss.version>
<qiniu-java-sdk.version>7.2.25</qiniu-java-sdk.version> <qiniu-java-sdk.version>7.2.25</qiniu-java-sdk.version>
<fastdfs-client.version>1.26.7</fastdfs-client.version> <fastdfs-client.version>1.26.7</fastdfs-client.version>
<mysql.version>8.0.19</mysql.version>
<mariadb.version>2.5.4</mariadb.version>
<oracle.version>19.3.0.0</oracle.version>
<postgresql.version>42.2.11</postgresql.version>
<sqlserver.version>8.2.1.jre8</sqlserver.version>
</properties> </properties>
<modules> <modules>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment