feat: 添加当前连接数据库信息

This commit is contained in:
bunny 2025-04-21 13:18:09 +08:00
parent faaca67cc6
commit 4f0007ee01
9 changed files with 171 additions and 141 deletions

View File

@ -1,6 +1,7 @@
package cn.bunny.controller; package cn.bunny.controller;
import cn.bunny.dao.entity.ColumnMetaData; import cn.bunny.dao.entity.ColumnMetaData;
import cn.bunny.dao.entity.DatabaseInfoMetaData;
import cn.bunny.dao.result.Result; import cn.bunny.dao.result.Result;
import cn.bunny.dao.vo.TableInfoVo; import cn.bunny.dao.vo.TableInfoVo;
import cn.bunny.service.TableService; import cn.bunny.service.TableService;
@ -26,6 +27,13 @@ public class TableController {
@Resource @Resource
private TableService tableService; private TableService tableService;
@Operation(summary = "当前数据库信息", description = "当前连接的数据库信息")
@GetMapping("databaseInfoMetaData")
public Result<DatabaseInfoMetaData> databaseInfoMetaData() {
DatabaseInfoMetaData databaseInfoMetaData = tableService.databaseInfoMetaData();
return Result.success(databaseInfoMetaData);
}
@Operation(summary = "当前配置的数据库", description = "当前配置的数据库") @Operation(summary = "当前配置的数据库", description = "当前配置的数据库")
@GetMapping("currentDatabaseName") @GetMapping("currentDatabaseName")
public Result<String> getCurrentDatabaseName() { public Result<String> getCurrentDatabaseName() {

View File

@ -1,19 +1,15 @@
package cn.bunny.core; package cn.bunny.core;
import cn.bunny.dao.entity.ColumnMetaData;
import cn.bunny.dao.entity.TableMetaData; import cn.bunny.dao.entity.TableMetaData;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import org.apache.commons.lang3.StringUtils; import lombok.SneakyThrows;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import javax.sql.DataSource; import javax.sql.DataSource;
import java.sql.Connection; import java.sql.Connection;
import java.sql.DatabaseMetaData; import java.sql.DatabaseMetaData;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashSet; import java.util.HashSet;
import java.util.List;
import java.util.Set; import java.util.Set;
/* 数据库信息内容 */ /* 数据库信息内容 */
@ -29,7 +25,8 @@ public class DatabaseInfoCore {
* @param tableName 表名 * @param tableName 表名
* @return 主键列名的集合 * @return 主键列名的集合
*/ */
public Set<String> getPrimaryKeyColumns(String tableName) throws SQLException { @SneakyThrows
public Set<String> getPrimaryKeyColumns(String tableName) {
// 主键的key // 主键的key
Set<String> primaryKeys = new HashSet<>(); Set<String> primaryKeys = new HashSet<>();
@ -49,43 +46,14 @@ public class DatabaseInfoCore {
} }
} }
/**
* 获取数据库中所有的表
*
* @param dbName 数据库名称如果不传为数据库中所有的表
* @return 当前/所有 的数据库表
*/
public List<TableMetaData> getDbTableList(String dbName) throws SQLException {
// 所有的表属性
List<TableMetaData> 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 数据库表名 * @param tableName 数据库表名
* @return 表信息 * @return 表信息
* @throws SQLException SQLException
*/ */
public TableMetaData tableInfo(String tableName) throws SQLException { @SneakyThrows
public TableMetaData tableInfoMetaData(String tableName) {
TableMetaData tableMetaData; TableMetaData tableMetaData;
try (Connection connection = dataSource.getConnection()) { try (Connection connection = dataSource.getConnection()) {
@ -116,78 +84,4 @@ public class DatabaseInfoCore {
return tableMetaData; return tableMetaData;
} }
} }
/**
* 数据库表列信息
*
* @param tableName 表名
* @return 列表信息
* @throws SQLException SQLException
*/
public List<ColumnMetaData> columnInfo(String tableName) throws SQLException {
try (Connection connection = dataSource.getConnection()) {
DatabaseMetaData metaData = connection.getMetaData();
List<ColumnMetaData> columns = new ArrayList<>();
// 当前表的主键
Set<String> 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> columnMetaData = columnInfo(tableName);
TableMetaData tableMetaData = tableInfo(tableName);
tableMetaData.setColumns(columnMetaData);
return tableMetaData;
}
} }

View File

@ -14,8 +14,11 @@ public class ColumnMetaData {
/* 列名称 */ /* 列名称 */
private String columnName; private String columnName;
/* 字段名称 */ /* 字段名称,小驼峰名称 */
private String fieldName; private String lowercaseName;
/* 大驼峰名称 */
private String uppercaseName;
/* 数据库字段类型 */ /* 数据库字段类型 */
private String jdbcType; private String jdbcType;

View File

@ -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;
}

View File

@ -1,6 +1,7 @@
package cn.bunny.service; package cn.bunny.service;
import cn.bunny.dao.entity.ColumnMetaData; import cn.bunny.dao.entity.ColumnMetaData;
import cn.bunny.dao.entity.DatabaseInfoMetaData;
import cn.bunny.dao.vo.TableInfoVo; import cn.bunny.dao.vo.TableInfoVo;
import java.util.List; import java.util.List;
@ -29,4 +30,11 @@ public interface TableService {
* @return 当前表所有的列内容 * @return 当前表所有的列内容
*/ */
List<ColumnMetaData> tableColumnInfo(String tableName); List<ColumnMetaData> tableColumnInfo(String tableName);
/**
* 数据库所有的信息
*
* @return 当前连接的数据库信息属性
*/
DatabaseInfoMetaData databaseInfoMetaData();
} }

View File

@ -1,20 +1,32 @@
package cn.bunny.service.impl; package cn.bunny.service.impl;
import cn.bunny.core.DatabaseInfoCore; import cn.bunny.core.DatabaseInfoCore;
import cn.bunny.core.TypeConvertCore;
import cn.bunny.dao.entity.ColumnMetaData; import cn.bunny.dao.entity.ColumnMetaData;
import cn.bunny.dao.entity.DatabaseInfoMetaData;
import cn.bunny.dao.entity.TableMetaData; import cn.bunny.dao.entity.TableMetaData;
import cn.bunny.dao.vo.TableInfoVo; import cn.bunny.dao.vo.TableInfoVo;
import cn.bunny.service.TableService; import cn.bunny.service.TableService;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import lombok.SneakyThrows; import lombok.SneakyThrows;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service; 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.List;
import java.util.Set;
@Service @Service
public class TableServiceImpl implements TableService { public class TableServiceImpl implements TableService {
@Resource
private DataSource dataSource;
@Resource @Resource
private DatabaseInfoCore databaseInfoCore; private DatabaseInfoCore databaseInfoCore;
@ -29,7 +41,7 @@ public class TableServiceImpl implements TableService {
public TableInfoVo tableMetaData(String tableName) { public TableInfoVo tableMetaData(String tableName) {
TableInfoVo tableInfoVo = new TableInfoVo(); TableInfoVo tableInfoVo = new TableInfoVo();
TableMetaData tableMetaData = databaseInfoCore.tableInfo(tableName); TableMetaData tableMetaData = databaseInfoCore.tableInfoMetaData(tableName);
BeanUtils.copyProperties(tableMetaData, tableInfoVo); BeanUtils.copyProperties(tableMetaData, tableInfoVo);
return tableInfoVo; return tableInfoVo;
@ -43,8 +55,26 @@ public class TableServiceImpl implements TableService {
@SneakyThrows @SneakyThrows
@Override @Override
public List<TableInfoVo> databaseTableList(String dbName) { public List<TableInfoVo> databaseTableList(String dbName) {
// 当前数据库数据库所有的表 // 当前数据库数据库所有的表
List<TableMetaData> allTableInfo = databaseInfoCore.getDbTableList(dbName); List<TableMetaData> 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 -> { return allTableInfo.stream().map(tableMetaData -> {
TableInfoVo tableInfoVo = new TableInfoVo(); TableInfoVo tableInfoVo = new TableInfoVo();
@ -63,6 +93,81 @@ public class TableServiceImpl implements TableService {
@SneakyThrows @SneakyThrows
@Override @Override
public List<ColumnMetaData> tableColumnInfo(String tableName) { public List<ColumnMetaData> tableColumnInfo(String tableName) {
return databaseInfoCore.columnInfo(tableName); try (Connection connection = dataSource.getConnection()) {
DatabaseMetaData metaData = connection.getMetaData();
List<ColumnMetaData> columns = new ArrayList<>();
// 当前表的主键
Set<String> 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();
}
} }
} }

View File

@ -1,5 +1,6 @@
package cn.bunny.service.impl; package cn.bunny.service.impl;
import cn.bunny.core.DatabaseInfoCore;
import cn.bunny.core.ResourceFileCore; import cn.bunny.core.ResourceFileCore;
import cn.bunny.dao.dto.VmsArgumentDto; import cn.bunny.dao.dto.VmsArgumentDto;
import cn.bunny.dao.entity.ColumnMetaData; import cn.bunny.dao.entity.ColumnMetaData;
@ -34,6 +35,9 @@ public class VmsServiceImpl implements VmsService {
@Resource @Resource
private TableService tableService; private TableService tableService;
@Resource
private DatabaseInfoCore databaseInfoCore;
/** /**
* 生成服务端代码 * 生成服务端代码
* *

View File

@ -84,7 +84,7 @@ public class JDBCTest {
while (columnsRs.next()) { while (columnsRs.next()) {
ColumnMetaData column = new ColumnMetaData(); ColumnMetaData column = new ColumnMetaData();
column.setColumnName(columnsRs.getString("COLUMN_NAME")); 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.setJdbcType(columnsRs.getString("TYPE_NAME"));
column.setJavaType(TypeConvertCore.convertToJavaType(column.getJdbcType())); column.setJavaType(TypeConvertCore.convertToJavaType(column.getJdbcType()));
column.setComment(columnsRs.getString("REMARKS")); column.setComment(columnsRs.getString("REMARKS"));

View File

@ -1,7 +1,5 @@
package cn.bunny.utils; package cn.bunny.utils;
import cn.bunny.core.DatabaseInfoCore;
import cn.bunny.dao.entity.ColumnMetaData;
import cn.bunny.dao.entity.TableMetaData; import cn.bunny.dao.entity.TableMetaData;
import lombok.SneakyThrows; import lombok.SneakyThrows;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
@ -12,7 +10,6 @@ import javax.sql.DataSource;
import java.sql.Connection; import java.sql.Connection;
import java.sql.DatabaseMetaData; import java.sql.DatabaseMetaData;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ -21,26 +18,12 @@ class DatabaseInfoCoreTest {
String tableName = "sys_i18n"; String tableName = "sys_i18n";
@Autowired
private DatabaseInfoCore databaseInfoCore;
@Autowired @Autowired
private DataSource dataSource; private DataSource dataSource;
@Test
void columnInfo() throws SQLException {
List<ColumnMetaData> columnMetaDataList = databaseInfoCore.columnInfo(tableName);
columnMetaDataList.forEach(System.out::println);
}
@Test @Test
void dbInfo() throws SQLException { void testTableInfoMetaData() {
TableMetaData tableMetaData = databaseInfoCore.dbInfo(tableName);
System.out.println(tableMetaData);
}
@Test
void testTableInfo() {
TableMetaData tableMetaData; TableMetaData tableMetaData;
try (Connection connection = dataSource.getConnection()) { try (Connection connection = dataSource.getConnection()) {
@ -51,13 +34,7 @@ class DatabaseInfoCoreTest {
if (tables.next()) { if (tables.next()) {
String remarks = tables.getString("REMARKS"); String remarks = tables.getString("REMARKS");
String tableCat = tables.getString("TABLE_CAT"); String tableCat = tables.getString("TABLE_CAT");
String tableSchem = tables.getString("TABLE_SCHEM");
String tableType = tables.getString("TABLE_TYPE"); 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() tableMetaData = TableMetaData.builder()
.tableName(tableName) .tableName(tableName)