From 4f0007ee01aff50e68cbf11688bc75dd78efc5f9 Mon Sep 17 00:00:00 2001 From: bunny <1319900154@qq.com> Date: Mon, 21 Apr 2025 13:18:09 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E5=BD=93=E5=89=8D?= =?UTF-8?q?=E8=BF=9E=E6=8E=A5=E6=95=B0=E6=8D=AE=E5=BA=93=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/bunny/controller/TableController.java | 8 ++ .../java/cn/bunny/core/DatabaseInfoCore.java | 116 +----------------- .../cn/bunny/dao/entity/ColumnMetaData.java | 7 +- .../dao/entity/DatabaseInfoMetaData.java | 31 +++++ .../java/cn/bunny/service/TableService.java | 8 ++ .../bunny/service/impl/TableServiceImpl.java | 111 ++++++++++++++++- .../cn/bunny/service/impl/VmsServiceImpl.java | 4 + .../src/test/java/cn/bunny/JDBCTest.java | 2 +- .../cn/bunny/utils/DatabaseInfoCoreTest.java | 25 +--- 9 files changed, 171 insertions(+), 141 deletions(-) create mode 100644 generator-code/src/main/java/cn/bunny/dao/entity/DatabaseInfoMetaData.java 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 60a6c00..b53163d 100644 --- a/generator-code/src/main/java/cn/bunny/controller/TableController.java +++ b/generator-code/src/main/java/cn/bunny/controller/TableController.java @@ -1,6 +1,7 @@ package cn.bunny.controller; import cn.bunny.dao.entity.ColumnMetaData; +import cn.bunny.dao.entity.DatabaseInfoMetaData; import cn.bunny.dao.result.Result; import cn.bunny.dao.vo.TableInfoVo; import cn.bunny.service.TableService; @@ -26,6 +27,13 @@ public class TableController { @Resource private TableService tableService; + @Operation(summary = "当前数据库信息", description = "当前连接的数据库信息") + @GetMapping("databaseInfoMetaData") + public Result databaseInfoMetaData() { + DatabaseInfoMetaData databaseInfoMetaData = tableService.databaseInfoMetaData(); + return Result.success(databaseInfoMetaData); + } + @Operation(summary = "当前配置的数据库", description = "当前配置的数据库") @GetMapping("currentDatabaseName") public Result getCurrentDatabaseName() { diff --git a/generator-code/src/main/java/cn/bunny/core/DatabaseInfoCore.java b/generator-code/src/main/java/cn/bunny/core/DatabaseInfoCore.java index 422f4af..4a11b02 100644 --- a/generator-code/src/main/java/cn/bunny/core/DatabaseInfoCore.java +++ b/generator-code/src/main/java/cn/bunny/core/DatabaseInfoCore.java @@ -1,19 +1,15 @@ package cn.bunny.core; -import cn.bunny.dao.entity.ColumnMetaData; import cn.bunny.dao.entity.TableMetaData; import jakarta.annotation.Resource; -import org.apache.commons.lang3.StringUtils; +import lombok.SneakyThrows; import org.springframework.stereotype.Component; 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.HashSet; -import java.util.List; import java.util.Set; /* 数据库信息内容 */ @@ -29,7 +25,8 @@ public class DatabaseInfoCore { * @param tableName 表名 * @return 主键列名的集合 */ - public Set getPrimaryKeyColumns(String tableName) throws SQLException { + @SneakyThrows + public Set getPrimaryKeyColumns(String tableName) { // 主键的key Set primaryKeys = new HashSet<>(); @@ -49,43 +46,14 @@ public class DatabaseInfoCore { } } - /** - * 获取数据库中所有的表 - * - * @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(dbName, null, "%", new String[]{"TABLE"}); - - while (tables.next()) { - // 表名称 - dbName = tables.getString("TABLE_NAME"); - - // 设置表信息 - TableMetaData tableMetaData = tableInfo(dbName); - list.add(tableMetaData); - } - - return list; - } - } - /** * 获取表注释信息 * * @param tableName 数据库表名 * @return 表信息 - * @throws SQLException SQLException */ - public TableMetaData tableInfo(String tableName) throws SQLException { + @SneakyThrows + public TableMetaData tableInfoMetaData(String tableName) { TableMetaData tableMetaData; try (Connection connection = dataSource.getConnection()) { @@ -116,78 +84,4 @@ public class DatabaseInfoCore { return tableMetaData; } } - - /** - * 数据库表列信息 - * - * @param tableName 表名 - * @return 列表信息 - * @throws SQLException SQLException - */ - 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 = TypeConvertCore.convertToJavaType(column.getJdbcType()); - - // 设置列字段 - column.setColumnName(columnName); - // 列字段转成 下划线 -> 小驼峰 - column.setFieldName(TypeConvertCore.convertToCamelCase(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()) { - // 是否是主键 - boolean isPrimaryKey = primaryKeyColumns.contains(columnName); - column.setIsPrimaryKey(isPrimaryKey); - } - columns.add(column); - } - } - - columns.get(0).setIsPrimaryKey(true); - - return columns; - } - } - - /** - * 数据库所有的信息 - * - * @param tableName 表名 - * @return 表内容 - * @throws SQLException SQLException - */ - public TableMetaData dbInfo(String tableName) throws SQLException { - List columnMetaData = columnInfo(tableName); - TableMetaData tableMetaData = tableInfo(tableName); - - tableMetaData.setColumns(columnMetaData); - - return tableMetaData; - } } diff --git a/generator-code/src/main/java/cn/bunny/dao/entity/ColumnMetaData.java b/generator-code/src/main/java/cn/bunny/dao/entity/ColumnMetaData.java index 4d868d0..d2c10d0 100644 --- a/generator-code/src/main/java/cn/bunny/dao/entity/ColumnMetaData.java +++ b/generator-code/src/main/java/cn/bunny/dao/entity/ColumnMetaData.java @@ -14,8 +14,11 @@ public class ColumnMetaData { /* 列名称 */ private String columnName; - /* 字段名称 */ - private String fieldName; + /* 字段名称,小驼峰名称 */ + private String lowercaseName; + + /* 大驼峰名称 */ + private String uppercaseName; /* 数据库字段类型 */ private String jdbcType; diff --git a/generator-code/src/main/java/cn/bunny/dao/entity/DatabaseInfoMetaData.java b/generator-code/src/main/java/cn/bunny/dao/entity/DatabaseInfoMetaData.java new file mode 100644 index 0000000..e6741c7 --- /dev/null +++ b/generator-code/src/main/java/cn/bunny/dao/entity/DatabaseInfoMetaData.java @@ -0,0 +1,31 @@ +package cn.bunny.dao.entity; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class DatabaseInfoMetaData { + + /* 数据库产品名称 */ + private String databaseProductName; + + /* 数据库产品版本 */ + private String databaseProductVersion; + + /* 驱动名称 */ + private String driverName; + + /* 数据库驱动版本 */ + private String driverVersion; + + /* 数据链接url */ + private String url; + + /* 数据库用户 */ + private String username; +} \ No newline at end of file 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 ff72bc8..bca186f 100644 --- a/generator-code/src/main/java/cn/bunny/service/TableService.java +++ b/generator-code/src/main/java/cn/bunny/service/TableService.java @@ -1,6 +1,7 @@ package cn.bunny.service; import cn.bunny.dao.entity.ColumnMetaData; +import cn.bunny.dao.entity.DatabaseInfoMetaData; import cn.bunny.dao.vo.TableInfoVo; import java.util.List; @@ -29,4 +30,11 @@ public interface TableService { * @return 当前表所有的列内容 */ List tableColumnInfo(String tableName); + + /** + * 数据库所有的信息 + * + * @return 当前连接的数据库信息属性 + */ + DatabaseInfoMetaData databaseInfoMetaData(); } 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 1bf4b3d..db6781c 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 @@ -1,20 +1,32 @@ package cn.bunny.service.impl; import cn.bunny.core.DatabaseInfoCore; +import cn.bunny.core.TypeConvertCore; import cn.bunny.dao.entity.ColumnMetaData; +import cn.bunny.dao.entity.DatabaseInfoMetaData; import cn.bunny.dao.entity.TableMetaData; import cn.bunny.dao.vo.TableInfoVo; import cn.bunny.service.TableService; import jakarta.annotation.Resource; import lombok.SneakyThrows; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; +import javax.sql.DataSource; +import java.sql.Connection; +import java.sql.DatabaseMetaData; +import java.sql.ResultSet; +import java.util.ArrayList; import java.util.List; +import java.util.Set; @Service public class TableServiceImpl implements TableService { + @Resource + private DataSource dataSource; + @Resource private DatabaseInfoCore databaseInfoCore; @@ -29,7 +41,7 @@ public class TableServiceImpl implements TableService { public TableInfoVo tableMetaData(String tableName) { TableInfoVo tableInfoVo = new TableInfoVo(); - TableMetaData tableMetaData = databaseInfoCore.tableInfo(tableName); + TableMetaData tableMetaData = databaseInfoCore.tableInfoMetaData(tableName); BeanUtils.copyProperties(tableMetaData, tableInfoVo); return tableInfoVo; @@ -43,8 +55,26 @@ public class TableServiceImpl implements TableService { @SneakyThrows @Override public List databaseTableList(String dbName) { + // 当前数据库数据库所有的表 - List allTableInfo = databaseInfoCore.getDbTableList(dbName); + List allTableInfo = new ArrayList<>(); + + try (Connection connection = dataSource.getConnection()) { + DatabaseMetaData metaData = connection.getMetaData(); + + // 当前数据库中所有的表 + ResultSet tables = metaData.getTables(dbName, null, "%", new String[]{"TABLE"}); + + while (tables.next()) { + // 表名称 + dbName = tables.getString("TABLE_NAME"); + + // 设置表信息 + TableMetaData tableMetaData = databaseInfoCore.tableInfoMetaData(dbName); + allTableInfo.add(tableMetaData); + } + + } return allTableInfo.stream().map(tableMetaData -> { TableInfoVo tableInfoVo = new TableInfoVo(); @@ -63,6 +93,81 @@ public class TableServiceImpl implements TableService { @SneakyThrows @Override public List tableColumnInfo(String tableName) { - return databaseInfoCore.columnInfo(tableName); + try (Connection connection = dataSource.getConnection()) { + DatabaseMetaData metaData = connection.getMetaData(); + + List columns = new ArrayList<>(); + + // 当前表的主键 + Set primaryKeyColumns = databaseInfoCore.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 = TypeConvertCore.convertToJavaType(column.getJdbcType()); + + // 设置列字段 + column.setColumnName(columnName); + + // 列字段转成 下划线 -> 小驼峰 + column.setLowercaseName(TypeConvertCore.convertToCamelCase(column.getColumnName())); + + // 列字段转成 下划线 -> 大驼峰名称 + column.setUppercaseName(TypeConvertCore.convertToCamelCase(column.getColumnName(), true)); + + // 字段类型 + 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()) { + // 是否是主键 + boolean isPrimaryKey = primaryKeyColumns.contains(columnName); + column.setIsPrimaryKey(isPrimaryKey); + } + columns.add(column); + } + } + + columns.get(0).setIsPrimaryKey(true); + + return columns; + } + } + + /** + * 数据库所有的信息 + * + * @return 当前连接的数据库信息属性 + */ + @SneakyThrows + @Override + public DatabaseInfoMetaData databaseInfoMetaData() { + try (Connection connection = dataSource.getConnection()) { + DatabaseMetaData metaData = connection.getMetaData(); + + return DatabaseInfoMetaData.builder() + .databaseProductName(metaData.getDatabaseProductName()) + .databaseProductVersion(metaData.getDatabaseProductVersion()) + .driverName(metaData.getDriverName()) + .driverVersion(metaData.getDriverVersion()) + .url(metaData.getURL()) + .username(metaData.getUserName()) + .build(); + } } } 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 50ef2fe..947f284 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 @@ -1,5 +1,6 @@ package cn.bunny.service.impl; +import cn.bunny.core.DatabaseInfoCore; import cn.bunny.core.ResourceFileCore; import cn.bunny.dao.dto.VmsArgumentDto; import cn.bunny.dao.entity.ColumnMetaData; @@ -34,6 +35,9 @@ public class VmsServiceImpl implements VmsService { @Resource private TableService tableService; + @Resource + private DatabaseInfoCore databaseInfoCore; + /** * 生成服务端代码 * diff --git a/generator-code/src/test/java/cn/bunny/JDBCTest.java b/generator-code/src/test/java/cn/bunny/JDBCTest.java index 085b194..2753380 100644 --- a/generator-code/src/test/java/cn/bunny/JDBCTest.java +++ b/generator-code/src/test/java/cn/bunny/JDBCTest.java @@ -84,7 +84,7 @@ public class JDBCTest { while (columnsRs.next()) { ColumnMetaData column = new ColumnMetaData(); column.setColumnName(columnsRs.getString("COLUMN_NAME")); - column.setFieldName(TypeConvertCore.convertToCamelCase(column.getColumnName())); + column.setLowercaseName(TypeConvertCore.convertToCamelCase(column.getColumnName())); column.setJdbcType(columnsRs.getString("TYPE_NAME")); column.setJavaType(TypeConvertCore.convertToJavaType(column.getJdbcType())); column.setComment(columnsRs.getString("REMARKS")); diff --git a/generator-code/src/test/java/cn/bunny/utils/DatabaseInfoCoreTest.java b/generator-code/src/test/java/cn/bunny/utils/DatabaseInfoCoreTest.java index 013bb79..033ffd1 100644 --- a/generator-code/src/test/java/cn/bunny/utils/DatabaseInfoCoreTest.java +++ b/generator-code/src/test/java/cn/bunny/utils/DatabaseInfoCoreTest.java @@ -1,7 +1,5 @@ package cn.bunny.utils; -import cn.bunny.core.DatabaseInfoCore; -import cn.bunny.dao.entity.ColumnMetaData; import cn.bunny.dao.entity.TableMetaData; import lombok.SneakyThrows; import org.junit.jupiter.api.Test; @@ -12,7 +10,6 @@ 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; @@ -21,26 +18,12 @@ class DatabaseInfoCoreTest { String tableName = "sys_i18n"; - @Autowired - private DatabaseInfoCore databaseInfoCore; - @Autowired private DataSource dataSource; - @Test - void columnInfo() throws SQLException { - List columnMetaDataList = databaseInfoCore.columnInfo(tableName); - columnMetaDataList.forEach(System.out::println); - } @Test - void dbInfo() throws SQLException { - TableMetaData tableMetaData = databaseInfoCore.dbInfo(tableName); - System.out.println(tableMetaData); - } - - @Test - void testTableInfo() { + void testTableInfoMetaData() { TableMetaData tableMetaData; try (Connection connection = dataSource.getConnection()) { @@ -51,13 +34,7 @@ class DatabaseInfoCoreTest { 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)