diff --git a/mf-api/mf-sys-api/src/main/java/cn/com/mfish/sys/api/entity/TableInfo.java b/mf-api/mf-sys-api/src/main/java/cn/com/mfish/sys/api/entity/TableInfo.java index f983c5bc..151d7e8c 100644 --- a/mf-api/mf-sys-api/src/main/java/cn/com/mfish/sys/api/entity/TableInfo.java +++ b/mf-api/mf-sys-api/src/main/java/cn/com/mfish/sys/api/entity/TableInfo.java @@ -23,7 +23,7 @@ public class TableInfo implements Serializable { private String tableName; @Schema(description = "表描述信息") private String tableComment; - @Schema(description = "库") + @Schema(description = "表空间") private String tableSchema; @Schema(description = "表类型 0表 1视图") private Integer tableType; diff --git a/mf-api/mf-sys-api/src/main/java/cn/com/mfish/sys/api/fallback/RemoteDbConnectFallback.java b/mf-api/mf-sys-api/src/main/java/cn/com/mfish/sys/api/fallback/RemoteDbConnectFallback.java index 3eefa0df..bfa93ca4 100644 --- a/mf-api/mf-sys-api/src/main/java/cn/com/mfish/sys/api/fallback/RemoteDbConnectFallback.java +++ b/mf-api/mf-sys-api/src/main/java/cn/com/mfish/sys/api/fallback/RemoteDbConnectFallback.java @@ -39,22 +39,22 @@ public class RemoteDbConnectFallback implements FallbackFactory> getTableList(String origin, String connectId, String tableName, ReqPage reqPage) { + public Result> getTableList(String origin, String connectId, String tableSchema, String tableName, ReqPage reqPage) { return Result.fail("错误:查询数据库表列表出错"); } @Override - public Result> getFieldList(String origin, String connectId, String tableName, ReqPage reqPage) { + public Result> getFieldList(String origin, String connectId, String tableSchema, String tableName, ReqPage reqPage) { return Result.fail("错误:查询表字段列表出错"); } @Override - public Result getDataTable(String origin, String connectId, String tableName, ReqPage reqPage) { + public Result getDataTable(String origin, String connectId, String tableSchema, String tableName, ReqPage reqPage) { return Result.fail("错误:查询表数据失败"); } @Override - public Result> getDataHeaders(String origin, String connectId, String tableName, ReqPage reqPage) { + public Result> getDataHeaders(String origin, String connectId, String tableSchema, String tableName, ReqPage reqPage) { return Result.fail("错误:获取表列头失败"); } }; diff --git a/mf-api/mf-sys-api/src/main/java/cn/com/mfish/sys/api/remote/RemoteDbConnectService.java b/mf-api/mf-sys-api/src/main/java/cn/com/mfish/sys/api/remote/RemoteDbConnectService.java index 425b79ca..7e355662 100644 --- a/mf-api/mf-sys-api/src/main/java/cn/com/mfish/sys/api/remote/RemoteDbConnectService.java +++ b/mf-api/mf-sys-api/src/main/java/cn/com/mfish/sys/api/remote/RemoteDbConnectService.java @@ -35,14 +35,14 @@ public interface RemoteDbConnectService { Result queryById(@RequestHeader(RPCConstants.REQ_ORIGIN) String origin, @PathVariable("id") String id); @GetMapping("/dbConnect/tables") - Result> getTableList(@RequestHeader(RPCConstants.REQ_ORIGIN) String origin, @RequestParam(name = "connectId") String connectId, @RequestParam(name = "tableName", required = false) String tableName, @SpringQueryMap ReqPage reqPage); + Result> getTableList(@RequestHeader(RPCConstants.REQ_ORIGIN) String origin, @RequestParam(name = "connectId") String connectId, @RequestParam(name = "tableSchema", required = false) String tableSchema, @RequestParam(name = "tableName", required = false) String tableName, @SpringQueryMap ReqPage reqPage); @GetMapping("/dbConnect/fields") - Result> getFieldList(@RequestHeader(RPCConstants.REQ_ORIGIN) String origin, @RequestParam(name = "connectId") String connectId, @RequestParam(name = "tableName", required = false) String tableName, @SpringQueryMap ReqPage reqPage); + Result> getFieldList(@RequestHeader(RPCConstants.REQ_ORIGIN) String origin, @RequestParam(name = "connectId") String connectId, @RequestParam(name = "tableSchema", required = false) String tableSchema, @RequestParam(name = "tableName", required = false) String tableName, @SpringQueryMap ReqPage reqPage); @GetMapping("/dbConnect/data") - Result getDataTable(@RequestHeader(RPCConstants.REQ_ORIGIN) String origin, @RequestParam(name = "connectId") String connectId, @RequestParam(name = "tableName", required = false) String tableName, @SpringQueryMap ReqPage reqPage); + Result getDataTable(@RequestHeader(RPCConstants.REQ_ORIGIN) String origin, @RequestParam(name = "connectId") String connectId, @RequestParam(name = "tableSchema", required = false) String tableSchema, @RequestParam(name = "tableName", required = false) String tableName, @SpringQueryMap ReqPage reqPage); @GetMapping("/dbConnect/headers") - Result> getDataHeaders(@RequestHeader(RPCConstants.REQ_ORIGIN) String origin, @RequestParam(name = "connectId") String connectId, @RequestParam(name = "tableName", required = false) String tableName, @SpringQueryMap ReqPage reqPage); + Result> getDataHeaders(@RequestHeader(RPCConstants.REQ_ORIGIN) String origin, @RequestParam(name = "connectId") String connectId, @RequestParam(name = "tableSchema", required = false) String tableSchema, @RequestParam(name = "tableName", required = false) String tableName, @SpringQueryMap ReqPage reqPage); } diff --git a/mf-business/mf-sys/src/main/java/cn/com/mfish/sys/controller/DbConnectController.java b/mf-business/mf-sys/src/main/java/cn/com/mfish/sys/controller/DbConnectController.java index fbc6bc62..06dfca52 100644 --- a/mf-business/mf-sys/src/main/java/cn/com/mfish/sys/controller/DbConnectController.java +++ b/mf-business/mf-sys/src/main/java/cn/com/mfish/sys/controller/DbConnectController.java @@ -68,11 +68,12 @@ public class DbConnectController { @RequiresPermissions("sys:database:query") @Parameters({ @Parameter(name = "connectId", description = "数据库ID", required = true), + @Parameter(name = "tableSchema", description = "表前缀"), @Parameter(name = "tableName", description = "表名") }) @DataScope(table = "sys_db_connect", type = DataScopeType.Tenant, excludes = "is_public=1") - public Result> getTableList(@RequestParam(name = "connectId") String connectId, @RequestParam(name = "tableName", required = false) String tableName, ReqPage reqPage) { - return Result.ok(new PageResult<>(tableService.getTableList(connectId, tableName, reqPage)), "获取表列表成功"); + public Result> getTableList(@RequestParam(name = "connectId") String connectId, @RequestParam(name = "tableSchema", required = false) String tableSchema, @RequestParam(name = "tableName", required = false) String tableName, ReqPage reqPage) { + return Result.ok(new PageResult<>(tableService.getTableList(connectId, tableSchema, tableName, reqPage)), "获取表列表成功"); } @Operation(summary = "获取数据库树形结构信息-只能分层查询") @@ -90,10 +91,11 @@ public class DbConnectController { } return Result.ok(treeNodes, "查询数据库列表成功"); } - List list = tableService.getTableList(parentId, null, null); + List list = tableService.getTableList(parentId, null, null, null); for (TableInfo tableInfo : list) { - String comment = StringUtils.isEmpty(tableInfo.getTableComment()) ? tableInfo.getTableName() : tableInfo.getTableName() + "[" + tableInfo.getTableComment() + "]"; - treeNodes.add(new DBTreeNode().setCode(tableInfo.getTableName()).setType(1).setLabel(comment)); + String name = tableInfo.getTableSchema() + "." + tableInfo.getTableName(); + String comment = StringUtils.isEmpty(tableInfo.getTableComment()) ? name : name + "[" + tableInfo.getTableComment() + "]"; + treeNodes.add(new DBTreeNode().setCode(name).setType(1).setLabel(comment)); } return Result.ok(treeNodes, "查询标列表成功"); } @@ -103,33 +105,36 @@ public class DbConnectController { @RequiresPermissions("sys:database:query") @Parameters({ @Parameter(name = "connectId", description = "数据库ID", required = true), + @Parameter(name = "tableSchema", description = "表前缀"), @Parameter(name = "tableName", description = "表名") }) @DataScope(table = "sys_db_connect", type = DataScopeType.Tenant, excludes = "is_public=1") - public Result> getFieldList(@RequestParam(name = "connectId") String connectId, @RequestParam(name = "tableName", required = false) String tableName, ReqPage reqPage) { - return Result.ok(new PageResult<>(tableService.getFieldList(connectId, tableName, reqPage)), "获取字段列表成功"); + public Result> getFieldList(@RequestParam(name = "connectId") String connectId, @RequestParam(name = "tableSchema", required = false) String tableSchema, @RequestParam(name = "tableName", required = false) String tableName, ReqPage reqPage) { + return Result.ok(new PageResult<>(tableService.getFieldList(connectId, tableSchema, tableName, reqPage)), "获取字段列表成功"); } @Operation(summary = "获取表数据") @GetMapping("/data") @Parameters({ @Parameter(name = "connectId", description = "数据库ID", required = true), + @Parameter(name = "tableSchema", description = "表前缀"), @Parameter(name = "tableName", description = "表名") }) @DataScope(table = "sys_db_connect", type = DataScopeType.Tenant, excludes = "is_public=1") - public Result getDataTable(@RequestParam(name = "connectId") String connectId, @RequestParam(name = "tableName", required = false) String tableName, ReqPage reqPage) { - return tableService.getHeaderDataTable(connectId, tableName, reqPage); + public Result getDataTable(@RequestParam(name = "connectId") String connectId, @RequestParam(name = "tableSchema", required = false) String tableSchema, @RequestParam(name = "tableName", required = false) String tableName, ReqPage reqPage) { + return tableService.getHeaderDataTable(connectId, tableSchema, tableName, reqPage); } @Operation(summary = "获取表列头信息") @GetMapping("/headers") @Parameters({ @Parameter(name = "connectId", description = "数据库ID", required = true), + @Parameter(name = "tableSchema", description = "表前缀"), @Parameter(name = "tableName", description = "表名") }) @DataScope(table = "sys_db_connect", type = DataScopeType.Tenant, excludes = "is_public=1") - public Result> getDataHeaders(@RequestParam(name = "connectId") String connectId, @RequestParam(name = "tableName", required = false) String tableName, ReqPage reqPage) { - List headers = tableService.getDataHeaders(connectId, tableName, reqPage); + public Result> getDataHeaders(@RequestParam(name = "connectId") String connectId, @RequestParam(name = "tableSchema", required = false) String tableSchema, @RequestParam(name = "tableName", required = false) String tableName, ReqPage reqPage) { + List headers = tableService.getDataHeaders(connectId, tableSchema, tableName, reqPage); return Result.ok(headers, "获取表列头成功"); } diff --git a/mf-business/mf-sys/src/main/java/cn/com/mfish/sys/service/impl/CodeBuildServiceImpl.java b/mf-business/mf-sys/src/main/java/cn/com/mfish/sys/service/impl/CodeBuildServiceImpl.java index edfbba15..7e0f5e6e 100644 --- a/mf-business/mf-sys/src/main/java/cn/com/mfish/sys/service/impl/CodeBuildServiceImpl.java +++ b/mf-business/mf-sys/src/main/java/cn/com/mfish/sys/service/impl/CodeBuildServiceImpl.java @@ -108,6 +108,12 @@ public class CodeBuildServiceImpl extends ServiceImpl 1) { + reqCode.setTableSchema(tableName[0]); + reqCode.setTableName(tableName[1]); + } if (!StringUtils.isEmpty(codeBuild.getQueryParams())) { reqCode.setSearches(JSON.parseArray(codeBuild.getQueryParams(), ReqSearch.class)); } diff --git a/mf-business/mf-sys/src/main/java/cn/com/mfish/sys/service/impl/TableServiceImpl.java b/mf-business/mf-sys/src/main/java/cn/com/mfish/sys/service/impl/TableServiceImpl.java index 2576fcca..63b3f514 100644 --- a/mf-business/mf-sys/src/main/java/cn/com/mfish/sys/service/impl/TableServiceImpl.java +++ b/mf-business/mf-sys/src/main/java/cn/com/mfish/sys/service/impl/TableServiceImpl.java @@ -42,15 +42,15 @@ public class TableServiceImpl implements TableService { private String privateKey; @Override - public List getFieldList(String connectId, String tableName, ReqPage reqPage) { + public List getFieldList(String connectId, String tableSchema, String tableName, ReqPage reqPage) { verifyTableName(tableName); - return queryT(connectId, FieldInfo.class, (build, dbName) -> build.getColumns(dbName, tableName), reqPage); + return queryT(connectId, FieldInfo.class, (build, dbName) -> build.getColumns(dbName, tableSchema, tableName), reqPage); } @Override - public TableInfo getTableInfo(String connectId, String tableName, ReqPage reqPage) { + public TableInfo getTableInfo(String connectId, String tableSchema, String tableName, ReqPage reqPage) { verifyTableName(tableName); - List list = getTableList(connectId, tableName, reqPage); + List list = getTableList(connectId, tableSchema, tableName, reqPage); if (list == null || list.isEmpty()) { return null; } @@ -58,22 +58,26 @@ public class TableServiceImpl implements TableService { } @Override - public List getTableList(String connectId, String tableName, ReqPage reqPage) { + public List getTableList(String connectId, String tableSchema, String tableName, ReqPage reqPage) { verifyTableName(tableName); - return queryT(connectId, TableInfo.class, (build, dbName) -> build.getTableInfo(dbName, tableName), reqPage); + return queryT(connectId, TableInfo.class, (build, dbName) -> build.getTableInfo(dbName, tableSchema, tableName), reqPage); } @Override - public Result getHeaderDataTable(String connectId, String tableName, ReqPage reqPage) { + public Result getHeaderDataTable(String connectId, String tableSchema, String tableName, ReqPage reqPage) { verifyTableName(tableName); - MetaDataTable table = getDataTable(connectId, tableName, reqPage); + MetaDataTable table = getDataTable(connectId, tableSchema, tableName, reqPage); return Result.ok(new MetaHeaderDataTable(table), "获取表数据成功"); } @Override - public MetaDataTable getDataTable(String connectId, String tableName, ReqPage reqPage) { + public MetaDataTable getDataTable(String connectId, String tableSchema, String tableName, ReqPage reqPage) { verifyTableName(tableName); - return query(connectId, "select * from " + tableName, reqPage); + if (StringUtils.isEmpty(tableSchema)) { + return query(connectId, "select * from " + tableName, reqPage); + } + return query(connectId, "select * from " + tableSchema + "." + tableName, reqPage); + } private void verifyTableName(String tableName) { @@ -86,7 +90,7 @@ public class TableServiceImpl implements TableService { if (tableName.length() > 128) { throw new MyRuntimeException("错误:表名称太长"); } - if (!StringUtils.isMatch("^[a-zA-Z0-9_\\.\\-]+$", tableName)) { + if (!StringUtils.isMatch("^[\\u4e00-\\u9fa5a-zA-Z0-9_\\.\\-]+$", tableName)) { throw new MyRuntimeException("错误:表名不允许包含特殊字符"); } } @@ -132,8 +136,8 @@ public class TableServiceImpl implements TableService { * @return 返回数据集列头 */ @Override - public List getDataHeaders(String connectId, String tableName, ReqPage reqPage) { - List list = getFieldList(connectId, tableName, reqPage); + public List getDataHeaders(String connectId, String tableSchema, String tableName, ReqPage reqPage) { + List list = getFieldList(connectId, tableSchema, tableName, reqPage); List headers = new ArrayList<>(); if (list == null || list.isEmpty()) { return headers; diff --git a/mf-common/mf-common-api/src/main/java/cn/com/mfish/common/api/BootDbConnectService.java b/mf-common/mf-common-api/src/main/java/cn/com/mfish/common/api/BootDbConnectService.java index 334b944a..65e9e074 100644 --- a/mf-common/mf-common-api/src/main/java/cn/com/mfish/common/api/BootDbConnectService.java +++ b/mf-common/mf-common-api/src/main/java/cn/com/mfish/common/api/BootDbConnectService.java @@ -41,22 +41,22 @@ public class BootDbConnectService implements RemoteDbConnectService { } @Override - public Result> getTableList(String origin, String connectId, String tableName, ReqPage reqPage) { - return Result.ok(new PageResult<>(tableService.getTableList(connectId, tableName, reqPage)), "获取表列表成功"); + public Result> getTableList(String origin, String connectId, String tableSchema, String tableName, ReqPage reqPage) { + return Result.ok(new PageResult<>(tableService.getTableList(connectId, tableSchema, tableName, reqPage)), "获取表列表成功"); } @Override - public Result> getFieldList(String origin, String connectId, String tableName, ReqPage reqPage) { - return Result.ok(new PageResult<>(tableService.getFieldList(connectId, tableName, reqPage)), "获取字段列表成功"); + public Result> getFieldList(String origin, String connectId, String tableSchema, String tableName, ReqPage reqPage) { + return Result.ok(new PageResult<>(tableService.getFieldList(connectId, tableSchema, tableName, reqPage)), "获取字段列表成功"); } @Override - public Result getDataTable(String origin, String connectId, String tableName, ReqPage reqPage) { - return tableService.getHeaderDataTable(connectId, tableName, reqPage); + public Result getDataTable(String origin, String connectId, String tableSchema, String tableName, ReqPage reqPage) { + return tableService.getHeaderDataTable(connectId, tableSchema, tableName, reqPage); } @Override - public Result> getDataHeaders(String origin, String connectId, String tableName, ReqPage reqPage) { - return Result.ok(tableService.getDataHeaders(connectId, tableName, reqPage), "获取表列头成功"); + public Result> getDataHeaders(String origin, String connectId, String tableSchema, String tableName, ReqPage reqPage) { + return Result.ok(tableService.getDataHeaders(connectId, tableSchema, tableName, reqPage), "获取表列头成功"); } } diff --git a/mf-common/mf-common-code/src/main/java/cn/com/mfish/common/code/common/FreemarkerUtils.java b/mf-common/mf-common-code/src/main/java/cn/com/mfish/common/code/common/FreemarkerUtils.java index 3146cb3d..a3c3b95b 100644 --- a/mf-common/mf-common-code/src/main/java/cn/com/mfish/common/code/common/FreemarkerUtils.java +++ b/mf-common/mf-common-code/src/main/java/cn/com/mfish/common/code/common/FreemarkerUtils.java @@ -103,7 +103,7 @@ public class FreemarkerUtils { } if (StringUtils.isEmpty(reqCode.getTableComment())) { reqCode.setTableComment(reqCode.getTableName()); - Result> result = remoteDbConnectService.getTableList(RPCConstants.INNER, reqCode.getConnectId(), reqCode.getTableName(), new ReqPage().setPageNum(1).setPageSize(10000)); + Result> result = remoteDbConnectService.getTableList(RPCConstants.INNER, reqCode.getConnectId(), reqCode.getTableSchema(), reqCode.getTableName(), new ReqPage().setPageNum(1).setPageSize(10000)); if (!result.isSuccess()) { throw new MyRuntimeException(result.getMsg()); } @@ -130,7 +130,7 @@ public class FreemarkerUtils { codeInfo.setPackageName(reqCode.getPackageName()); codeInfo.setEntityName(reqCode.getEntityName()); codeInfo.setApiPrefix(reqCode.getApiPrefix()); - Result> result = remoteDbConnectService.getFieldList(RPCConstants.INNER, reqCode.getConnectId(), reqCode.getTableName(), new ReqPage().setPageNum(1).setPageSize(10000)); + Result> result = remoteDbConnectService.getFieldList(RPCConstants.INNER, reqCode.getConnectId(), reqCode.getTableSchema(), reqCode.getTableName(), new ReqPage().setPageNum(1).setPageSize(10000)); if (!result.isSuccess()) { throw new MyRuntimeException(result.getMsg()); } @@ -242,7 +242,7 @@ public class FreemarkerUtils { * 参数替换 * 根据提供的映射表,对字符串中的变量进行替换 * - * @param key 待处理的原始字符串,可能包含待替换的变量 + * @param key 待处理的原始字符串,可能包含待替换的变量 * @param mapValue 包含变量和其对应值的映射表 * @return 替换变量后的字符串 */ @@ -304,7 +304,7 @@ public class FreemarkerUtils { /** * 保存代码到本地 * - * @param list 代码列表,包含要保存的代码信息 + * @param list 代码列表,包含要保存的代码信息 * @param savePath 保存路径,用于指定代码保存的位置 * @return boolean 表示保存是否成功 */ diff --git a/mf-common/mf-common-code/src/main/java/cn/com/mfish/common/code/req/ReqCode.java b/mf-common/mf-common-code/src/main/java/cn/com/mfish/common/code/req/ReqCode.java index dc95d56a..b39af6e5 100644 --- a/mf-common/mf-common-code/src/main/java/cn/com/mfish/common/code/req/ReqCode.java +++ b/mf-common/mf-common-code/src/main/java/cn/com/mfish/common/code/req/ReqCode.java @@ -16,6 +16,8 @@ import java.util.List; public class ReqCode { @Schema(description = "数据库连接ID(必传 通过数据库列表接口查询)") private String connectId; + @Schema(description = "表前缀(不传使用空字符串)") + private String tableSchema; @Schema(description = "表名(必传)") private String tableName; @Schema(description = "表描述(不传会获取数据库表中的中文描述,如果也为空则使用表名)") diff --git a/mf-common/mf-common-dblink/pom.xml b/mf-common/mf-common-dblink/pom.xml index b8e2fdb5..4ace6621 100644 --- a/mf-common/mf-common-dblink/pom.xml +++ b/mf-common/mf-common-dblink/pom.xml @@ -47,6 +47,10 @@ org.postgresql postgresql + + com.microsoft.sqlserver + mssql-jdbc + junit junit diff --git a/mf-common/mf-common-dblink/src/main/java/cn/com/mfish/common/dblink/db/AbstractDBDialect.java b/mf-common/mf-common-dblink/src/main/java/cn/com/mfish/common/dblink/db/AbstractDBDialect.java index f981d34f..0a02420d 100644 --- a/mf-common/mf-common-dblink/src/main/java/cn/com/mfish/common/dblink/db/AbstractDBDialect.java +++ b/mf-common/mf-common-dblink/src/main/java/cn/com/mfish/common/dblink/db/AbstractDBDialect.java @@ -34,11 +34,11 @@ public abstract class AbstractDBDialect implements DBDialect { * 它还负责生成与数据库方案匹配的参数,考虑大小写的情况 * * @param sql 初始SQL查询字符串该查询通常不包含具体的表名或数据库名条件 - * @param dbName 数据库名称非空时,将被用作查询条件的一部分 + * @param tableSchema 表前缀非空时,将被用作查询条件的一部分 * @param tableName 表名称非空时,将被用作查询条件的一部分 * @return BoundSql对象,其中包含经过条件补充的SQL查询语句及相关的参数 */ - protected BoundSql buildCondition(String sql, String dbName, String tableName) { + protected BoundSql buildCondition(String sql, String tableSchema, String tableName) { BoundSql boundSql = new BoundSql(); boundSql.setDbType(DBType.mysql); if (!StringUtils.isEmpty(tableName)) { @@ -46,10 +46,10 @@ public abstract class AbstractDBDialect implements DBDialect { boundSql.getParams().add(new QueryParam().setValue(tableName.toUpperCase())); boundSql.getParams().add(new QueryParam().setValue(tableName.toLowerCase())); } - if (!StringUtils.isEmpty(dbName)) { + if (!StringUtils.isEmpty(tableSchema)) { sql += " and (table_schema = ? or table_schema = ?)"; - boundSql.getParams().add(new QueryParam().setValue(dbName.toUpperCase())); - boundSql.getParams().add(new QueryParam().setValue(dbName.toLowerCase())); + boundSql.getParams().add(new QueryParam().setValue(tableSchema.toUpperCase())); + boundSql.getParams().add(new QueryParam().setValue(tableSchema.toLowerCase())); } return boundSql.setSql(sql); } diff --git a/mf-common/mf-common-dblink/src/main/java/cn/com/mfish/common/dblink/db/DBAdapter.java b/mf-common/mf-common-dblink/src/main/java/cn/com/mfish/common/dblink/db/DBAdapter.java index 81eb27d2..b9ecd4d9 100644 --- a/mf-common/mf-common-dblink/src/main/java/cn/com/mfish/common/dblink/db/DBAdapter.java +++ b/mf-common/mf-common-dblink/src/main/java/cn/com/mfish/common/dblink/db/DBAdapter.java @@ -22,6 +22,7 @@ public class DBAdapter { dialectMap.put(DBType.mysql, new MysqlDBDialect()); dialectMap.put(DBType.postgre, new PostgreDBDialect()); dialectMap.put(DBType.oracle, new OracleDBDialect()); + dialectMap.put(DBType.sqlserver2012, new SqlServerDBDialect()); } /** diff --git a/mf-common/mf-common-dblink/src/main/java/cn/com/mfish/common/dblink/db/DBDialect.java b/mf-common/mf-common-dblink/src/main/java/cn/com/mfish/common/dblink/db/DBDialect.java index 477e4511..27aa1cb8 100644 --- a/mf-common/mf-common-dblink/src/main/java/cn/com/mfish/common/dblink/db/DBDialect.java +++ b/mf-common/mf-common-dblink/src/main/java/cn/com/mfish/common/dblink/db/DBDialect.java @@ -17,17 +17,19 @@ public interface DBDialect { * 用于动态SQL或查询构建前的准备,确保后续操作基于正确的表结构执行 * * @param dbName 库名,指定要查询表字段信息的数据库 + * @param tableSchema 表前缀,用于筛选特定的表 * @param tableName 表名,指定要查询字段信息的具体表 * @return BoundSql 包含指定表字段信息的绑定SQL对象 */ - BoundSql getColumns(String dbName, String tableName); + BoundSql getColumns(String dbName, String tableSchema, String tableName); /** * 获取表信息 * * @param dbName 库名 + * @param tableSchema 表前缀 * @param tableName 表名 * @return BoundSql 对象,包含表的信息 */ - BoundSql getTableInfo(String dbName, String tableName); + BoundSql getTableInfo(String dbName, String tableSchema, String tableName); } diff --git a/mf-common/mf-common-dblink/src/main/java/cn/com/mfish/common/dblink/db/MysqlDBDialect.java b/mf-common/mf-common-dblink/src/main/java/cn/com/mfish/common/dblink/db/MysqlDBDialect.java index f42de550..b6d4e00a 100644 --- a/mf-common/mf-common-dblink/src/main/java/cn/com/mfish/common/dblink/db/MysqlDBDialect.java +++ b/mf-common/mf-common-dblink/src/main/java/cn/com/mfish/common/dblink/db/MysqlDBDialect.java @@ -1,5 +1,6 @@ package cn.com.mfish.common.dblink.db; +import cn.com.mfish.common.core.utils.StringUtils; import cn.com.mfish.common.dblink.page.BoundSql; /** @@ -14,7 +15,7 @@ public class MysqlDBDialect extends AbstractDBDialect { } @Override - public BoundSql getColumns(String dbName, String tableName) { + public BoundSql getColumns(String dbName, String tableSchema, String tableName) { String sql = """ select column_name field_name, data_type db_type , if(column_key = 'PRI', true, false) is_primary @@ -22,15 +23,18 @@ public class MysqlDBDialect extends AbstractDBDialect { , column_type , column_comment comment from information_schema.columns where 1=1"""; - BoundSql boundSql = buildCondition(sql, dbName, tableName); + //mysql如果没传入前缀则默认使用数据库名 + String schema = StringUtils.isEmpty(tableSchema) ? dbName : tableSchema; + BoundSql boundSql = buildCondition(sql, schema, tableName); boundSql.setSql(boundSql.getSql() + " order by ordinal_position"); return boundSql; } @Override - public BoundSql getTableInfo(String dbName, String tableName) { + public BoundSql getTableInfo(String dbName, String tableSchema, String tableName) { + String schema = StringUtils.isEmpty(tableSchema) ? dbName : tableSchema; String sql = "SELECT table_name, table_comment, table_schema, if(table_type='VIEW',1,0) table_type" + " FROM INFORMATION_SCHEMA.TABLES where 1=1"; - return buildCondition(sql, dbName, tableName); + return buildCondition(sql, schema, tableName); } } diff --git a/mf-common/mf-common-dblink/src/main/java/cn/com/mfish/common/dblink/db/OracleDBDialect.java b/mf-common/mf-common-dblink/src/main/java/cn/com/mfish/common/dblink/db/OracleDBDialect.java index aabfae00..03ffc9b1 100644 --- a/mf-common/mf-common-dblink/src/main/java/cn/com/mfish/common/dblink/db/OracleDBDialect.java +++ b/mf-common/mf-common-dblink/src/main/java/cn/com/mfish/common/dblink/db/OracleDBDialect.java @@ -19,7 +19,7 @@ public class OracleDBDialect implements DBDialect { } @Override - public BoundSql getColumns(String dbName, String tableName) { + public BoundSql getColumns(String dbName, String tableSchema, String tableName) { String sql = """ select a.COLUMN_NAME as "field_name", a.DATA_TYPE as "db_type", @@ -45,13 +45,13 @@ public class OracleDBDialect implements DBDialect { } @Override - public BoundSql getTableInfo(String dbName, String tableName) { + public BoundSql getTableInfo(String dbName, String tableSchema, String tableName) { String sql = """ select u.table_name, u.comments table_comment, a.owner table_schema,DECODE(u.table_type,'VIEW', 1, 0) table_type from user_tab_comments u inner join all_tab_comments a on u.table_name = a.table_name - where 1 = 1"""; + where u.table_name not like 'BIN$%'"""; return buildCondition(sql, tableName); } diff --git a/mf-common/mf-common-dblink/src/main/java/cn/com/mfish/common/dblink/db/PostgreDBDialect.java b/mf-common/mf-common-dblink/src/main/java/cn/com/mfish/common/dblink/db/PostgreDBDialect.java index 4fc3b34c..a8ab5567 100644 --- a/mf-common/mf-common-dblink/src/main/java/cn/com/mfish/common/dblink/db/PostgreDBDialect.java +++ b/mf-common/mf-common-dblink/src/main/java/cn/com/mfish/common/dblink/db/PostgreDBDialect.java @@ -1,5 +1,6 @@ package cn.com.mfish.common.dblink.db; +import cn.com.mfish.common.dblink.enums.DBType; import cn.com.mfish.common.dblink.page.BoundSql; /** @@ -14,7 +15,7 @@ public class PostgreDBDialect extends AbstractDBDialect { } @Override - public BoundSql getColumns(String dbName, String tableName) { + public BoundSql getColumns(String dbName, String tableSchema, String tableName) { String strSql = """ SELECT A.attname AS FIELD_NAME, T.typname AS db_type, @@ -31,11 +32,13 @@ public class PostgreDBDialect extends AbstractDBDialect { LEFT JOIN pg_description d ON d.objoid = A.attrelid AND d.objsubid = A.attnum where 1=1"""; //pg数据库table_schema是单独定义的schema不是数据库名称,此处暂时不传。参数预留 - return buildCondition(strSql, "", tableName); + BoundSql boundSql = buildCondition(strSql, tableSchema, tableName); + boundSql.setDbType(DBType.postgre); + return boundSql; } @Override - public BoundSql getTableInfo(String dbName, String tableName) { + public BoundSql getTableInfo(String dbName, String tableSchema, String tableName) { String strSql = """ SELECT d.table_name, @@ -50,6 +53,8 @@ public class PostgreDBDialect extends AbstractDBDialect { AND ( c.relkind = 'r' OR c.relkind = 'v' ) AND c.relname = d.TABLE_NAME"""; //pg数据库table_schema是单独定义的schema不是数据库名称,此处暂时不传。参数预留 - return buildCondition(strSql, "", tableName); + BoundSql boundSql = buildCondition(strSql, tableSchema, tableName); + boundSql.setDbType(DBType.postgre); + return boundSql; } } diff --git a/mf-common/mf-common-dblink/src/main/java/cn/com/mfish/common/dblink/db/SqlServerDBDialect.java b/mf-common/mf-common-dblink/src/main/java/cn/com/mfish/common/dblink/db/SqlServerDBDialect.java new file mode 100644 index 00000000..a33e5618 --- /dev/null +++ b/mf-common/mf-common-dblink/src/main/java/cn/com/mfish/common/dblink/db/SqlServerDBDialect.java @@ -0,0 +1,83 @@ +package cn.com.mfish.common.dblink.db; + +import cn.com.mfish.common.dblink.enums.DBType; +import cn.com.mfish.common.dblink.page.BoundSql; + +/** + * @description: SQLServer数据库方言 + * @author: mfish + * @date: 2025/3/4 + */ +public class SqlServerDBDialect extends AbstractDBDialect { + @Override + public String getJdbc(String host, String port, String dbName) { + return "jdbc:sqlserver://" + host + ":" + port + ";databaseName=" + dbName + ";encrypt=false"; + } + + @Override + public BoundSql getColumns(String dbName, String tableSchema, String tableName) { + String sql = """ + select * from (SELECT + t.name AS table_name, + sc.name AS table_schema, + c.name AS field_name, + s.name db_type, + CASE WHEN i.is_primary_key IS NULL THEN + 0 ELSE i.is_primary_key + END AS is_primary, + c.is_nullable nullable, + concat ( s.name, '(', c.max_length, ')' ) AS column_type, + p.value AS comment + FROM + sys.columns c + JOIN sys.types s ON c.user_type_id = s.user_type_id + LEFT JOIN sys.index_columns ic ON c.object_id = ic.object_id + AND c.column_id = ic.column_id + LEFT JOIN sys.indexes i ON ic.object_id = i.object_id + AND ic.index_id = i.index_id + JOIN sys.tables t ON c.object_id = t.object_id + LEFT JOIN sys.schemas sc ON t.schema_id = sc.schema_id + LEFT JOIN sys.extended_properties p ON c.object_id = p.major_id + AND c.column_id = p.minor_id + AND p.name = 'MS_Description' ) a + WHERE 1=1"""; + BoundSql boundSql = buildCondition(sql, tableSchema, tableName); + boundSql.setDbType(DBType.sqlserver2012); + return boundSql; + } + + @Override + public BoundSql getTableInfo(String dbName, String tableSchema, String tableName) { + String sql = """ + SELECT table_name,table_comment,table_schema,table_type FROM + ( + SELECT + t.name table_name, + p.value table_comment, + s.name table_schema, + 0 table_type, + t.create_date + FROM + sys.tables t + LEFT JOIN sys.extended_properties p ON t.object_id = p.major_id + AND p.name = 'MS_Description' + LEFT JOIN sys.schemas s ON t.schema_id = s.schema_id UNION + SELECT + v.name table_name, + '' table_comment, + s.name table_schema, + 1 table_type, + v.create_date + FROM + sys.views v + LEFT JOIN sys.schemas s ON v.schema_id = s.schema_id + ) a + where 1=1"""; + BoundSql boundSql = buildCondition(sql, "", tableName); + boundSql.setSql(boundSql.getSql() + " ORDER BY a.create_date"); + boundSql.setDbType(DBType.sqlserver2012); + return boundSql; + } + + +} diff --git a/mf-common/mf-common-dblink/src/main/java/cn/com/mfish/common/dblink/enums/DBType.java b/mf-common/mf-common-dblink/src/main/java/cn/com/mfish/common/dblink/enums/DBType.java index 36361d00..f7a5add1 100644 --- a/mf-common/mf-common-dblink/src/main/java/cn/com/mfish/common/dblink/enums/DBType.java +++ b/mf-common/mf-common-dblink/src/main/java/cn/com/mfish/common/dblink/enums/DBType.java @@ -8,7 +8,8 @@ package cn.com.mfish.common.dblink.enums; public enum DBType { mysql(0), postgre(1), - oracle(2); + oracle(2), + sqlserver2012(3); private final int value; @@ -45,6 +46,7 @@ public enum DBType { return switch (this) { case oracle -> "oracle.jdbc.OracleDriver"; case postgre -> "org.postgresql.Driver"; + case sqlserver2012 -> "com.microsoft.sqlserver.jdbc.SQLServerDriver"; default -> "com.mysql.cj.jdbc.Driver"; }; } diff --git a/mf-common/mf-common-dblink/src/main/java/cn/com/mfish/common/dblink/page/DialectAdapter.java b/mf-common/mf-common-dblink/src/main/java/cn/com/mfish/common/dblink/page/DialectAdapter.java index 992e56a2..e906f951 100644 --- a/mf-common/mf-common-dblink/src/main/java/cn/com/mfish/common/dblink/page/DialectAdapter.java +++ b/mf-common/mf-common-dblink/src/main/java/cn/com/mfish/common/dblink/page/DialectAdapter.java @@ -27,6 +27,7 @@ public class DialectAdapter { registerDialectAlias(DBType.mysql, MysqlDialect.class); registerDialectAlias(DBType.oracle, OracleDialect.class); registerDialectAlias(DBType.postgre, PostgreDialect.class); + registerDialectAlias(DBType.sqlserver2012, SqlServer2012Dialect.class); } private final ThreadLocal dialectThreadLocal = new ThreadLocal<>(); diff --git a/mf-common/mf-common-dblink/src/main/java/cn/com/mfish/common/dblink/page/dialect/AbstractDialect.java b/mf-common/mf-common-dblink/src/main/java/cn/com/mfish/common/dblink/page/dialect/AbstractDialect.java index c7bbdc5d..7c142c23 100644 --- a/mf-common/mf-common-dblink/src/main/java/cn/com/mfish/common/dblink/page/dialect/AbstractDialect.java +++ b/mf-common/mf-common-dblink/src/main/java/cn/com/mfish/common/dblink/page/dialect/AbstractDialect.java @@ -69,7 +69,7 @@ public abstract class AbstractDialect implements Dialect { public String getSimpleCountSql(final String sql, String name) { return "SELECT COUNT(" + name + - ") FROM ( \n" + + ") COUNT FROM ( \n" + sql + "\n ) TMP_COUNT"; } diff --git a/mf-common/mf-common-dblink/src/main/java/cn/com/mfish/common/dblink/page/dialect/SqlServer2012Dialect.java b/mf-common/mf-common-dblink/src/main/java/cn/com/mfish/common/dblink/page/dialect/SqlServer2012Dialect.java new file mode 100644 index 00000000..788bb0f9 --- /dev/null +++ b/mf-common/mf-common-dblink/src/main/java/cn/com/mfish/common/dblink/page/dialect/SqlServer2012Dialect.java @@ -0,0 +1,72 @@ +package cn.com.mfish.common.dblink.page.dialect; + +import cn.com.mfish.common.core.enums.DataType; +import cn.com.mfish.common.dblink.entity.QueryParam; +import cn.com.mfish.common.dblink.page.BoundSql; +import cn.com.mfish.common.dblink.query.BaseQuery; +import com.github.pagehelper.Page; +import net.sf.jsqlparser.JSQLParserException; +import net.sf.jsqlparser.parser.CCJSqlParserUtil; +import net.sf.jsqlparser.statement.select.OrderByElement; +import net.sf.jsqlparser.statement.select.PlainSelect; + +import java.util.List; + +/** + * @description: sqlserver相关方言 + * @author: mfish + * @date: 2025/3/4 + */ +public class SqlServer2012Dialect extends AbstractDialect { + public SqlServer2012Dialect(BaseQuery baseQuery) { + super(baseQuery); + } + + @Override + public String getSimpleCountSql(final String sql, String name) { + try { + PlainSelect select = (PlainSelect) CCJSqlParserUtil.parse(sql); + //sqlserver order不允许放在字句中 + select.setOrderByElements(null); + return "SELECT COUNT(" + + name + + ") COUNT FROM ( \n" + + select + + "\n ) TMP_COUNT"; + } catch (JSQLParserException e) { + throw new RuntimeException(e); + } + + } + + @Override + protected BoundSql getPageSql(BoundSql boundSql, Page page) { + try { + PlainSelect select = (PlainSelect) CCJSqlParserUtil.parse(boundSql.getSql()); + List list = select.getOrderByElements(); + StringBuilder sb = new StringBuilder(); + if(list != null && !list.isEmpty()) { + for (OrderByElement orderByElement : list) { + sb.append(orderByElement.getExpression().toString()); + if (!orderByElement.isAsc()) { + sb.append(" DESC"); + } + sb.append(" ,"); + } + } + if (!sb.isEmpty()) { + sb.deleteCharAt(sb.length() - 1); + } else { + sb.append("1"); + } + select.setOrderByElements(null); + String sql = select + + " ORDER BY " + sb + " OFFSET ? ROWS FETCH NEXT ? ROWS ONLY"; + boundSql.getParams().add(new QueryParam().setValue(page.getStartRow()).setType(DataType.INTEGER)); + boundSql.getParams().add(new QueryParam().setValue(page.getPageSize()).setType(DataType.INTEGER)); + return boundSql.setSql(sql); + } catch (JSQLParserException e) { + throw new RuntimeException(e); + } + } +} diff --git a/mf-common/mf-common-dblink/src/main/java/cn/com/mfish/common/dblink/query/BaseQuery.java b/mf-common/mf-common-dblink/src/main/java/cn/com/mfish/common/dblink/query/BaseQuery.java index bb5804d2..c007006d 100644 --- a/mf-common/mf-common-dblink/src/main/java/cn/com/mfish/common/dblink/query/BaseQuery.java +++ b/mf-common/mf-common-dblink/src/main/java/cn/com/mfish/common/dblink/query/BaseQuery.java @@ -20,6 +20,9 @@ import lombok.extern.slf4j.Slf4j; import oracle.sql.TIMESTAMP; import oracle.sql.TIMESTAMPTZ; +import java.io.IOException; +import java.io.Reader; +import java.io.StringWriter; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.math.BigDecimal; @@ -321,6 +324,8 @@ public class BaseQuery { columnTypeName = columnTypeName.toUpperCase(Locale.ROOT); if (columnTypeName.contains(DataConstant.DataType.BINARY) || columnTypeName.contains(DataConstant.DataType.BLOB)) { value = new String((byte[]) value); + } else if (columnTypeName.contains(DataConstant.DataType.CLOB) || columnTypeName.contains(DataConstant.DataType.NCLOB)) { + value = clobToString((Clob) value); } else if (columnTypeName.contains(DataConstant.DataType.GEOMETRY)) { value = value.toString(); } else if (columnTypeName.contains(DataConstant.DataType.BIT)) { @@ -338,6 +343,22 @@ public class BaseQuery { return value; } + private static String clobToString(Clob clob) { + StringBuilder stringBuilder = new StringBuilder(); + try (Reader reader = clob.getCharacterStream(); + StringWriter writer = new StringWriter()) { + char[] buffer = new char[1024]; + int bytesRead; + while ((bytesRead = reader.read(buffer)) != -1) { + writer.write(buffer, 0, bytesRead); + } + stringBuilder.append(writer.toString()); + } catch (SQLException | IOException e) { + log.error("nclob数据类型转换异常", e); + } + return stringBuilder.toString(); + } + /** * 获取连接 * diff --git a/mf-common/mf-common-dblink/src/main/java/cn/com/mfish/common/dblink/service/TableService.java b/mf-common/mf-common-dblink/src/main/java/cn/com/mfish/common/dblink/service/TableService.java index 896ee2f2..13d33a0b 100644 --- a/mf-common/mf-common-dblink/src/main/java/cn/com/mfish/common/dblink/service/TableService.java +++ b/mf-common/mf-common-dblink/src/main/java/cn/com/mfish/common/dblink/service/TableService.java @@ -23,7 +23,7 @@ public interface TableService { * @param tableName 表名 * @return 返回字段列表 */ - List getFieldList(String connectId, String tableName, ReqPage reqPage); + List getFieldList(String connectId, String tableSchema, String tableName, ReqPage reqPage); /** * 获取表信息 @@ -32,7 +32,7 @@ public interface TableService { * @param tableName 表名 * @return 返回表信息 */ - TableInfo getTableInfo(String connectId, String tableName, ReqPage reqPage); + TableInfo getTableInfo(String connectId, String tableSchema, String tableName, ReqPage reqPage); /** * 获取表列表 @@ -41,17 +41,17 @@ public interface TableService { * @param tableName 表名 * @return 返回表列表 */ - List getTableList(String connectId, String tableName, ReqPage reqPage); + List getTableList(String connectId, String tableSchema, String tableName, ReqPage reqPage); /** * 获取带头信息数据 * * @param connectId 数据库连接ID * @param tableName 表名 - * @param reqPage 翻页参数 + * @param reqPage 翻页参数 * @return 返回头信息数据 */ - Result getHeaderDataTable(String connectId, String tableName, ReqPage reqPage); + Result getHeaderDataTable(String connectId, String tableSchema, String tableName, ReqPage reqPage); /** * 获取数据 @@ -60,7 +60,7 @@ public interface TableService { * @param tableName 表名 * @return 返回数据 */ - MetaDataTable getDataTable(String connectId, String tableName, ReqPage reqPage); + MetaDataTable getDataTable(String connectId, String tableSchema, String tableName, ReqPage reqPage); /** * 获取字段 @@ -70,5 +70,5 @@ public interface TableService { * @param reqPage 分页 * @return 返回字段 */ - List getDataHeaders(String connectId, String tableName, ReqPage reqPage); + List getDataHeaders(String connectId, String tableSchema, String tableName, ReqPage reqPage); } diff --git a/mf-start/mf-start-boot/lib/mf-common-bi-mf-1.3.2-pg.jar b/mf-start/mf-start-boot/lib/mf-common-bi-mf-1.3.2-pg.jar index 57713200..80ae8cd8 100644 Binary files a/mf-start/mf-start-boot/lib/mf-common-bi-mf-1.3.2-pg.jar and b/mf-start/mf-start-boot/lib/mf-common-bi-mf-1.3.2-pg.jar differ diff --git a/mf-start/mf-start-boot/lib/mf-nocode-mf-1.3.2.jar b/mf-start/mf-start-boot/lib/mf-nocode-mf-1.3.2.jar index acc65dfc..3ecb32fc 100644 Binary files a/mf-start/mf-start-boot/lib/mf-nocode-mf-1.3.2.jar and b/mf-start/mf-start-boot/lib/mf-nocode-mf-1.3.2.jar differ diff --git a/mf-start/mf-start-nocode/lib/mf-common-bi-mf-1.3.2-pg.jar b/mf-start/mf-start-nocode/lib/mf-common-bi-mf-1.3.2-pg.jar index 57713200..80ae8cd8 100644 Binary files a/mf-start/mf-start-nocode/lib/mf-common-bi-mf-1.3.2-pg.jar and b/mf-start/mf-start-nocode/lib/mf-common-bi-mf-1.3.2-pg.jar differ diff --git a/mf-start/mf-start-nocode/lib/mf-nocode-mf-1.3.2.jar b/mf-start/mf-start-nocode/lib/mf-nocode-mf-1.3.2.jar index acc65dfc..3ecb32fc 100644 Binary files a/mf-start/mf-start-nocode/lib/mf-nocode-mf-1.3.2.jar and b/mf-start/mf-start-nocode/lib/mf-nocode-mf-1.3.2.jar differ diff --git a/pom.xml b/pom.xml index 8e6b2a9c..d6368e4d 100644 --- a/pom.xml +++ b/pom.xml @@ -51,6 +51,7 @@ 1.79 23.5.0.24.07 42.7.4 + 12.8.1.jre11 1.1.0 @@ -301,6 +302,11 @@ postgresql ${pgsql.version} + + com.microsoft.sqlserver + mssql-jdbc + ${mssql.version} + cn.com.mfish mf-common-core