From dfdf9546b0e7381b541603a7cde36ba44a7b0e6f Mon Sep 17 00:00:00 2001 From: bunny <1319900154@qq.com> Date: Wed, 9 Apr 2025 21:23:26 +0800 Subject: [PATCH] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/bunny/controller/TableController.java | 25 +++++- .../cn/bunny/dao/entity/TableMetaData.java | 36 +++------ .../java/cn/bunny/dao/vo/TableInfoVo.java | 26 +----- .../java/cn/bunny/service/TableService.java | 4 +- .../bunny/service/impl/TableServiceImpl.java | 9 ++- .../cn/bunny/service/impl/VmsServiceImpl.java | 6 +- .../main/java/cn/bunny/utils/DbInfoUtil.java | 69 +++++++++++----- .../java/cn/bunny/utils/ResourceFileUtil.java | 3 + .../src/main/java/cn/bunny/utils/VmsUtil.java | 30 ++++++- .../src/main/resources/application-dev.yml | 7 +- .../src/test/java/cn/bunny/JDBCTest.java | 28 ------- .../java/cn/bunny/utils/DbInfoUtilTest.java | 81 ++++++++++++++++--- 12 files changed, 190 insertions(+), 134 deletions(-) diff --git a/generator-code/src/main/java/cn/bunny/controller/TableController.java b/generator-code/src/main/java/cn/bunny/controller/TableController.java index 48d1765..3b22936 100644 --- a/generator-code/src/main/java/cn/bunny/controller/TableController.java +++ b/generator-code/src/main/java/cn/bunny/controller/TableController.java @@ -11,6 +11,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.List; +import java.util.stream.Collectors; @Tag(name = "数据库表控制器", description = "数据库表信息接口") @RestController @@ -23,11 +24,27 @@ public class TableController { this.tableService = tableService; } + @Operation(summary = "数据库所有的表", description = "获取[当前/所有]数据库表") + @GetMapping("getDbTables") + public Result> getDbTables(String dbName) { + List list = tableService.getDbTables(dbName); + return Result.success(list); + } + + @Operation(summary = "所有的数据库", description = "所有的数据库") + @GetMapping("getDbList") + public Result> getDbList() { + List allDb = tableService.getDbTables(null); + + List list = allDb.stream() + .collect(Collectors.groupingBy(TableInfoVo::getTableCat)) + .values().stream() + .map(tableInfoVos -> { + TableInfoVo tableInfoVo = tableInfoVos.get(0); + tableInfoVo.setTableName(null); + return tableInfoVo; + }).toList(); - @Operation(summary = "获取所有表", description = "获取所有表") - @GetMapping("getAllTableMetaData") - public Result> getAllTableMetaData() { - List list = tableService.getAllTableMetaData(); return Result.success(list); } diff --git a/generator-code/src/main/java/cn/bunny/dao/entity/TableMetaData.java b/generator-code/src/main/java/cn/bunny/dao/entity/TableMetaData.java index dfbe5b1..502c817 100644 --- a/generator-code/src/main/java/cn/bunny/dao/entity/TableMetaData.java +++ b/generator-code/src/main/java/cn/bunny/dao/entity/TableMetaData.java @@ -13,39 +13,21 @@ import java.util.List; @NoArgsConstructor public class TableMetaData { - /* 表目录 */ - private String tableCat; - - /* 表模式(可能为null) */ - private String tableSchem; - - /* 表类型(通常是"TABLE") */ - private String tableType; - - /* 类型的目录(可能为null) */ - private String typeCat; - - /* 类型的模式(可能为null) */ - private String typeSchem; - - /* 类型名称(可能为null) */ - private String typeName; - - /* 自引用列名(可能为null) */ - private String selfReferencingColName; - - /* 引用生成(可能为null) */ - private String refGeneration; - /* 表名 */ private String tableName; - /* 类名 */ - private String className; - /* 注释内容 */ private String comment; + /* 表目录 */ + private String tableCat; + + /* 表类型(通常是"TABLE") */ + private String tableType; + + /* 类名 */ + private String className; + /* 列名称 */ private List columns; } \ No newline at end of file diff --git a/generator-code/src/main/java/cn/bunny/dao/vo/TableInfoVo.java b/generator-code/src/main/java/cn/bunny/dao/vo/TableInfoVo.java index b9dcb00..c60e480 100644 --- a/generator-code/src/main/java/cn/bunny/dao/vo/TableInfoVo.java +++ b/generator-code/src/main/java/cn/bunny/dao/vo/TableInfoVo.java @@ -14,34 +14,16 @@ public class TableInfoVo { /* 表目录 */ private String tableCat; - /* 表模式(可能为null) */ - private String tableSchem; + /* 表名 */ + private String tableName; /* 表类型(通常是"TABLE") */ private String tableType; - /* 类型的目录(可能为null) */ - private String typeCat; - - /* 类型的模式(可能为null) */ - private String typeSchem; - - /* 类型名称(可能为null) */ - private String typeName; - - /* 自引用列名(可能为null) */ - private String selfReferencingColName; - - /* 引用生成(可能为null) */ - private String refGeneration; - - /* 表名 */ - private String tableName; + /* 注释内容 */ + private String comment; /* 类名 */ private String className; - /* 注释内容 */ - private String comment; - } diff --git a/generator-code/src/main/java/cn/bunny/service/TableService.java b/generator-code/src/main/java/cn/bunny/service/TableService.java index 4ee94fb..7f72b71 100644 --- a/generator-code/src/main/java/cn/bunny/service/TableService.java +++ b/generator-code/src/main/java/cn/bunny/service/TableService.java @@ -16,11 +16,11 @@ public interface TableService { TableInfoVo getTableMetaData(String tableName); /** - * 获取所有表 + * 获取所有数据库 * * @return 所有表信息 */ - List getAllTableMetaData(); + List getDbTables(String tableName); /** * 获取列属性 diff --git a/generator-code/src/main/java/cn/bunny/service/impl/TableServiceImpl.java b/generator-code/src/main/java/cn/bunny/service/impl/TableServiceImpl.java index 3d25424..640f9da 100644 --- a/generator-code/src/main/java/cn/bunny/service/impl/TableServiceImpl.java +++ b/generator-code/src/main/java/cn/bunny/service/impl/TableServiceImpl.java @@ -38,14 +38,15 @@ public class TableServiceImpl implements TableService { } /** - * 获取所有表 + * 获取[当前/所有]数据库表 * * @return 所有表信息 */ @SneakyThrows @Override - public List getAllTableMetaData() { - List allTableInfo = dbInfoUtil.getAllTableInfo(); + public List getDbTables(String dbName) { + // 当前数据库数据库所有的表 + List allTableInfo = dbInfoUtil.getDbTableList(dbName); return allTableInfo.stream().map(tableMetaData -> { TableInfoVo tableInfoVo = new TableInfoVo(); @@ -56,7 +57,7 @@ public class TableServiceImpl implements TableService { } /** - * 获取列属性 + * 获取当前表的列属性 * * @param tableName 表名称 * @return 当前表所有的列内容 diff --git a/generator-code/src/main/java/cn/bunny/service/impl/VmsServiceImpl.java b/generator-code/src/main/java/cn/bunny/service/impl/VmsServiceImpl.java index 6d7e395..5725339 100644 --- a/generator-code/src/main/java/cn/bunny/service/impl/VmsServiceImpl.java +++ b/generator-code/src/main/java/cn/bunny/service/impl/VmsServiceImpl.java @@ -63,6 +63,7 @@ public class VmsServiceImpl implements VmsService { // 数据库sql列 context.put("baseColumnList", String.join(",", list)); + // 生成模板 VmsUtil.commonVms(writer, context, "vms/" + path, dto); return GeneratorVo.builder() @@ -82,9 +83,8 @@ public class VmsServiceImpl implements VmsService { @SneakyThrows @Override public Map> getVmsPathList() { - List vmsRelativeFiles; - - vmsRelativeFiles = ResourceFileUtil.getRelativeFiles("vms"); + // 读取当前项目中所有的 vm 模板发给前端 + List vmsRelativeFiles = ResourceFileUtil.getRelativeFiles("vms"); return vmsRelativeFiles.stream().map(vmFile -> { String[] filepathList = vmFile.split("/"); diff --git a/generator-code/src/main/java/cn/bunny/utils/DbInfoUtil.java b/generator-code/src/main/java/cn/bunny/utils/DbInfoUtil.java index 72ed2fe..7afdd6f 100644 --- a/generator-code/src/main/java/cn/bunny/utils/DbInfoUtil.java +++ b/generator-code/src/main/java/cn/bunny/utils/DbInfoUtil.java @@ -23,7 +23,7 @@ public class DbInfoUtil { public DbInfoUtil(DataSource dataSource) { this.dataSource = dataSource; } - + /** * 获取表的所有主键列名 * @@ -31,31 +31,47 @@ public class DbInfoUtil { * @return 主键列名的集合 */ public Set getPrimaryKeyColumns(String tableName) throws SQLException { - + // 主键的key Set primaryKeys = new HashSet<>(); try (Connection connection = dataSource.getConnection()) { DatabaseMetaData metaData = connection.getMetaData(); + + // 当前表的主键 ResultSet pkResultSet = metaData.getPrimaryKeys(null, null, tableName); while (pkResultSet.next()) { - primaryKeys.add(pkResultSet.getString("COLUMN_NAME").toLowerCase()); + // 列字段 + String columnName = pkResultSet.getString("COLUMN_NAME").toLowerCase(); + primaryKeys.add(columnName); } return primaryKeys; } } - public List getAllTableInfo() throws SQLException { + /** + * 获取数据库中所有的表 + * + * @param dbName 数据库名称,如果不传为数据库中所有的表 + * @return 当前/所有 的数据库表 + */ + public List getDbTableList(String dbName) throws SQLException { + // 所有的表属性 + List list = new ArrayList<>(); + try (Connection connection = dataSource.getConnection()) { DatabaseMetaData metaData = connection.getMetaData(); - ResultSet tables = metaData.getTables(null, null, "%", new String[]{"TABLE"}); - List list = new ArrayList<>(); + // 当前数据库中所有的表 + ResultSet tables = metaData.getTables(dbName, null, "%", new String[]{"TABLE"}); while (tables.next()) { - String tableName = tables.getString("TABLE_NAME"); - TableMetaData tableMetaData = tableInfo(tableName); + // 表名称 + dbName = tables.getString("TABLE_NAME"); + + // 设置表信息 + TableMetaData tableMetaData = tableInfo(dbName); list.add(tableMetaData); } @@ -79,27 +95,20 @@ public class DbInfoUtil { // 获取表的注释信息 if (tables.next()) { + // 备注信息 String remarks = tables.getString("REMARKS"); + + // 数组名称 String tableCat = tables.getString("TABLE_CAT"); - String tableSchem = tables.getString("TABLE_SCHEM"); + + // 通常是"TABLE" String tableType = tables.getString("TABLE_TYPE"); - String typeCat = tables.getString("TYPE_CAT"); - String typeSchem = tables.getString("TYPE_SCHEM"); - String typeName = tables.getString("TYPE_NAME"); - String selfReferencingColName = tables.getString("SELF_REFERENCING_COL_NAME"); - String refGeneration = tables.getString("REF_GENERATION"); tableMetaData = TableMetaData.builder() .tableName(tableName) .comment(remarks) .tableCat(tableCat) - .tableSchem(tableSchem) .tableType(tableType) - .typeCat(typeCat) - .typeSchem(typeSchem) - .typeName(typeName) - .selfReferencingColName(selfReferencingColName) - .refGeneration(refGeneration) .build(); } else { throw new RuntimeException("数据表不存在"); @@ -110,7 +119,7 @@ public class DbInfoUtil { } /** - * 数据库列信息 + * 数据库表列信息 * * @param tableName 表名 * @return 列表信息 @@ -119,27 +128,43 @@ public class DbInfoUtil { public List columnInfo(String tableName) throws SQLException { try (Connection connection = dataSource.getConnection()) { DatabaseMetaData metaData = connection.getMetaData(); + List columns = new ArrayList<>(); + // 当前表的主键 Set primaryKeyColumns = getPrimaryKeyColumns(tableName); + // 当前表的列信息 try (ResultSet columnsRs = metaData.getColumns(null, null, tableName, null)) { while (columnsRs.next()) { ColumnMetaData column = new ColumnMetaData(); + + // 列字段 String columnName = columnsRs.getString("COLUMN_NAME"); + // 将当前表的列类型转成 Java 类型 String javaType = ConvertUtil.convertToJavaType(column.getJdbcType()); + // 设置列字段 column.setColumnName(columnName); + // 列字段转成 下划线 -> 小驼峰 column.setFieldName(ConvertUtil.convertToFieldName(column.getColumnName())); + + // 字段类型 column.setJdbcType(columnsRs.getString("TYPE_NAME")); + // 字段类型转 Java 类型 column.setJavaType(javaType); + // 字段类型转 JavaScript 类型 column.setJavascriptType(StringUtils.uncapitalize(javaType)); + + // 备注信息 column.setComment(columnsRs.getString("REMARKS")); // 确保 primaryKeyColumns 不为空 if (!primaryKeyColumns.isEmpty()) { - column.setIsPrimaryKey(primaryKeyColumns.contains(columnName)); + // 是否是主键 + boolean isPrimaryKey = primaryKeyColumns.contains(columnName); + column.setIsPrimaryKey(isPrimaryKey); } columns.add(column); diff --git a/generator-code/src/main/java/cn/bunny/utils/ResourceFileUtil.java b/generator-code/src/main/java/cn/bunny/utils/ResourceFileUtil.java index 5ab5fbe..f5d641d 100644 --- a/generator-code/src/main/java/cn/bunny/utils/ResourceFileUtil.java +++ b/generator-code/src/main/java/cn/bunny/utils/ResourceFileUtil.java @@ -16,6 +16,7 @@ import java.util.jar.JarFile; import java.util.stream.Stream; public class ResourceFileUtil { + /** * 获取目标文件夹下所有文件完整路径 * @@ -25,6 +26,8 @@ public class ResourceFileUtil { */ public static List getAbsoluteFiles(String dirname) throws IOException { List fileNames = new ArrayList<>(); + + // 加载当前类 ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); Enumeration urls = classLoader.getResources(dirname); diff --git a/generator-code/src/main/java/cn/bunny/utils/VmsUtil.java b/generator-code/src/main/java/cn/bunny/utils/VmsUtil.java index 15d8bb7..a84905c 100644 --- a/generator-code/src/main/java/cn/bunny/utils/VmsUtil.java +++ b/generator-code/src/main/java/cn/bunny/utils/VmsUtil.java @@ -13,31 +13,53 @@ import java.util.concurrent.atomic.AtomicReference; public class VmsUtil { /** + * 生成模板 + * * @param writer 写入字符串内容 * @param context Velocity上下文 * @param templateName 模板名称 * @param dto 类名称可以自定义,格式为 xxx_xxx */ public static void commonVms(StringWriter writer, VelocityContext context, String templateName, VmsArgumentDto dto) { + // 类名称如果是小驼峰,需要 [手写] 为 [下划线] 之后由 [代码 -> 小驼峰/大驼峰] String className = dto.getClassName(); + + // 去除表开头前缀 String tablePrefixes = dto.getTablePrefixes(); + + // 当前捉着 String author = dto.getAuthor(); + + // 每个 Controller 上的请求前缀 String requestMapping = dto.getRequestMapping(); + // 将 表前缀 转成数组 AtomicReference replaceTableName = new AtomicReference<>(className); - for (String prefix : tablePrefixes.split("[,,]" )) { - replaceTableName.set(className.replace(prefix, "" )); + for (String prefix : tablePrefixes.split("[,,]")) { + replaceTableName.set(className.replace(prefix, "")); } String date = new SimpleDateFormat(dto.getSimpleDateFormat()).format(new Date()); - context.put("leftBrace", "{" ); + // vm 不能直接写 `{` 需要转换下 + context.put("leftBrace", "{"); + + // 当前日期 context.put("date", date); + + // 作者名字 context.put("author", author); + + // 每个 Controller 上的请求前缀 context.put("requestMapping", requestMapping); + + // 将类名称转成小驼峰 context.put("classLowercaseName", ConvertUtil.convertToCamelCase(replaceTableName.get())); + + // 将类名称转成大驼峰 context.put("classUppercaseName", ConvertUtil.convertToCamelCase(replaceTableName.get(), true)); - Template servicePathTemplate = Velocity.getTemplate(templateName, "UTF-8" ); + // Velocity 生成模板 + Template servicePathTemplate = Velocity.getTemplate(templateName, "UTF-8"); servicePathTemplate.merge(context, writer); } } diff --git a/generator-code/src/main/resources/application-dev.yml b/generator-code/src/main/resources/application-dev.yml index 3cabf82..7342bc0 100644 --- a/generator-code/src/main/resources/application-dev.yml +++ b/generator-code/src/main/resources/application-dev.yml @@ -1,11 +1,8 @@ bunny: master: - host: 192.168.3.137 + # host: 192.168.3.137 + host: localhost port: 3306 database: auth_admin username: root password: "123456" - connect: - url: jdbc:sqlite::resource:database.sqlite - username: root - password: "123456" \ No newline at end of file diff --git a/generator-code/src/test/java/cn/bunny/JDBCTest.java b/generator-code/src/test/java/cn/bunny/JDBCTest.java index 9b1ec74..5f1fe1d 100644 --- a/generator-code/src/test/java/cn/bunny/JDBCTest.java +++ b/generator-code/src/test/java/cn/bunny/JDBCTest.java @@ -45,25 +45,11 @@ public class JDBCTest { if (tables.next()) { String remarks = tables.getString("REMARKS"); String tableCat = tables.getString("TABLE_CAT"); - String tableSchem = tables.getString("TABLE_SCHEM"); - String tableType = tables.getString("TABLE_TYPE"); - String typeCat = tables.getString("TYPE_CAT"); - String typeSchem = tables.getString("TYPE_SCHEM"); - String typeName = tables.getString("TYPE_NAME"); - String selfReferencingColName = tables.getString("SELF_REFERENCING_COL_NAME"); - String refGeneration = tables.getString("REF_GENERATION"); tableMetaData = TableMetaData.builder() .tableName(tableName) .comment(remarks) .tableCat(tableCat) - .tableSchem(tableSchem) - .tableType(tableType) - .typeCat(typeCat) - .typeSchem(typeSchem) - .typeName(typeName) - .selfReferencingColName(selfReferencingColName) - .refGeneration(refGeneration) .build(); System.out.println(tableMetaData); @@ -79,24 +65,10 @@ public class JDBCTest { String tableName = tables.getString("TABLE_NAME"); String remarks = tables.getString("REMARKS"); String tableCat = tables.getString("TABLE_CAT"); - String tableSchem = tables.getString("TABLE_SCHEM"); - String tableType = tables.getString("TABLE_TYPE"); - String typeCat = tables.getString("TYPE_CAT"); - String typeSchem = tables.getString("TYPE_SCHEM"); - String typeName = tables.getString("TYPE_NAME"); - String selfReferencingColName = tables.getString("SELF_REFERENCING_COL_NAME"); - String refGeneration = tables.getString("REF_GENERATION"); TableMetaData tableMetaData = TableMetaData.builder() .tableName(tableName).comment(remarks) .tableCat(tableCat) - .tableSchem(tableSchem) - .tableType(tableType) - .typeCat(typeCat) - .typeSchem(typeSchem) - .typeName(typeName) - .selfReferencingColName(selfReferencingColName) - .refGeneration(refGeneration) .build(); list.add(tableMetaData); } diff --git a/generator-code/src/test/java/cn/bunny/utils/DbInfoUtilTest.java b/generator-code/src/test/java/cn/bunny/utils/DbInfoUtilTest.java index fcdacea..4c6820f 100644 --- a/generator-code/src/test/java/cn/bunny/utils/DbInfoUtilTest.java +++ b/generator-code/src/test/java/cn/bunny/utils/DbInfoUtilTest.java @@ -2,10 +2,17 @@ package cn.bunny.utils; import cn.bunny.dao.entity.ColumnMetaData; import cn.bunny.dao.entity.TableMetaData; +import lombok.SneakyThrows; import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import javax.sql.DataSource; +import java.sql.Connection; +import java.sql.DatabaseMetaData; +import java.sql.ResultSet; import java.sql.SQLException; +import java.util.ArrayList; import java.util.List; @SpringBootTest @@ -13,20 +20,11 @@ class DbInfoUtilTest { String tableName = "sys_i18n"; - // @Autowired - // private DbInfoUtil dbInfoUtil; + @Autowired + private DbInfoUtil dbInfoUtil; - private final DbInfoUtil dbInfoUtil; - - public DbInfoUtilTest(DbInfoUtil dbInfoUtil) { - this.dbInfoUtil = dbInfoUtil; - } - - @Test - void tableInfo() throws SQLException { - TableMetaData tableMetaData = dbInfoUtil.tableInfo(tableName); - System.out.println(tableMetaData); - } + @Autowired + private DataSource dataSource; @Test void columnInfo() throws SQLException { @@ -39,4 +37,61 @@ class DbInfoUtilTest { TableMetaData tableMetaData = dbInfoUtil.dbInfo(tableName); System.out.println(tableMetaData); } + + @Test + void testTableInfo() { + TableMetaData tableMetaData; + + try (Connection connection = dataSource.getConnection()) { + DatabaseMetaData metaData = connection.getMetaData(); + ResultSet tables = metaData.getTables(null, null, tableName, new String[]{"TABLE"}); + + // 获取表的注释信息 + if (tables.next()) { + String remarks = tables.getString("REMARKS"); + String tableCat = tables.getString("TABLE_CAT"); + String tableSchem = tables.getString("TABLE_SCHEM"); + String tableType = tables.getString("TABLE_TYPE"); + String typeCat = tables.getString("TYPE_CAT"); + String typeSchem = tables.getString("TYPE_SCHEM"); + String typeName = tables.getString("TYPE_NAME"); + String selfReferencingColName = tables.getString("SELF_REFERENCING_COL_NAME"); + String refGeneration = tables.getString("REF_GENERATION"); + + tableMetaData = TableMetaData.builder() + .tableName(tableName) + .comment(remarks) + .tableCat(tableCat) + .tableType(tableType) + .build(); + } else { + throw new RuntimeException("数据表不存在"); + } + + System.out.println(tableMetaData); + + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + @SneakyThrows + @Test + void getDbTableList() { + String dbName = "auth_admin"; + + try (Connection connection = dataSource.getConnection()) { + DatabaseMetaData metaData = connection.getMetaData(); + ResultSet tables = metaData.getTables(dbName, null, "%", new String[]{"TABLE"}); + + List list = new ArrayList<>(); + + while (tables.next()) { + dbName = tables.getString("TABLE_NAME"); + list.add(dbName); + } + + System.out.println(list); + } + } } \ No newline at end of file