feat: 添加当前连接数据库信息
This commit is contained in:
parent
faaca67cc6
commit
4f0007ee01
|
@ -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() {
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -14,8 +14,11 @@ public class ColumnMetaData {
|
|||
/* 列名称 */
|
||||
private String columnName;
|
||||
|
||||
/* 字段名称 */
|
||||
private String fieldName;
|
||||
/* 字段名称,小驼峰名称 */
|
||||
private String lowercaseName;
|
||||
|
||||
/* 大驼峰名称 */
|
||||
private String uppercaseName;
|
||||
|
||||
/* 数据库字段类型 */
|
||||
private String jdbcType;
|
||||
|
|
|
@ -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;
|
||||
}
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
||||
/**
|
||||
* 生成服务端代码
|
||||
*
|
||||
|
|
|
@ -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"));
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue