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;
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 databaseInfoMetaData = tableService.databaseInfoMetaData();
return Result.success(databaseInfoMetaData);
}
@Operation(summary = "当前配置的数据库", description = "当前配置的数据库")
@GetMapping("currentDatabaseName")
public Result<String> getCurrentDatabaseName() {

View File

@ -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<String> getPrimaryKeyColumns(String tableName) throws SQLException {
@SneakyThrows
public Set<String> getPrimaryKeyColumns(String tableName) {
// 主键的key
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 数据库表名
* @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<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 fieldName;
/* 字段名称,小驼峰名称 */
private String lowercaseName;
/* 大驼峰名称 */
private String uppercaseName;
/* 数据库字段类型 */
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;
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<ColumnMetaData> tableColumnInfo(String tableName);
/**
* 数据库所有的信息
*
* @return 当前连接的数据库信息属性
*/
DatabaseInfoMetaData databaseInfoMetaData();
}

View File

@ -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<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 -> {
TableInfoVo tableInfoVo = new TableInfoVo();
@ -63,6 +93,81 @@ public class TableServiceImpl implements TableService {
@SneakyThrows
@Override
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;
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;
/**
* 生成服务端代码
*

View File

@ -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"));

View File

@ -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<ColumnMetaData> 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)