Commit 4652b4fc authored by alex yao's avatar alex yao

feat: database数据表查询

parent 5c14255a
package cn.com.poc.common.utils; package cn.com.poc.common.utils;
import cn.com.yict.framemax.core.exception.BusinessException;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import java.sql.Connection; import java.sql.Connection;
import java.sql.DriverManager; import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
/** /**
* @author alex.yao * @author alex.yao
...@@ -16,7 +21,19 @@ public class DatabaseUtil { ...@@ -16,7 +21,19 @@ public class DatabaseUtil {
private static final int CONNECT_TIMEOUT = 5000; // 连接超时时间(毫秒) private static final int CONNECT_TIMEOUT = 5000; // 连接超时时间(毫秒)
private static final int SOCKET_TIMEOUT = 5000; // socket超时时间(毫秒) private static final int SOCKET_TIMEOUT = 30000; // socket超时时间(毫秒)
private static final String SQL_TABLE_INFO = "SELECT " +
" TABLE_NAME ," +
" TABLE_COMMENT," +
" TABLE_ROWS," +
" (SELECT COUNT(*) " +
" FROM INFORMATION_SCHEMA.COLUMNS " +
" WHERE TABLE_SCHEMA = t.TABLE_SCHEMA " +
" AND TABLE_NAME = t.TABLE_NAME) AS TABLE_COLUMN " +
"FROM INFORMATION_SCHEMA.TABLES t " +
"WHERE TABLE_SCHEMA = ?";
;
/** /**
* 测试数据库连接 * 测试数据库连接
...@@ -29,24 +46,90 @@ public class DatabaseUtil { ...@@ -29,24 +46,90 @@ public class DatabaseUtil {
* @return * @return
*/ */
public static boolean testConnect(String host, int port, String username, String password, String database) { public static boolean testConnect(String host, int port, String username, String password, String database) {
String url = "jdbc:mysql://" + host + ":" + port + "/" + database String url = "jdbc:mysql://" + host + ":" + port + "/" + database
+ "?connectTimeout=" + CONNECT_TIMEOUT // 连接超时(毫秒) + "?connectTimeout=" + CONNECT_TIMEOUT // 连接超时(毫秒)
+ "&socketTimeout=" + SOCKET_TIMEOUT; // socket超时(毫秒) + "&socketTimeout=" + SOCKET_TIMEOUT; // socket超时(毫秒)
Connection connection = null; try (Connection connection = DriverManager.getConnection(url, username, password)) {
try {
connection = DriverManager.getConnection(url, username, password);
return true; return true;
} catch (Exception e) { } catch (Exception e) {
return false; return false;
} finally { }
if (connection != null) { }
try {
connection.close(); /**
} catch (Exception e) { * 获取数据库表列表
logger.error("关闭数据库连接失败", e); */
} public static List<TableInfo> getTableInfo(String host, int port, String username, String password, String database) {
String url = "jdbc:mysql://" + host + ":" + port + "/" + database
+ "?connectTimeout=" + CONNECT_TIMEOUT // 连接超时(毫秒)
+ "&socketTimeout=" + SOCKET_TIMEOUT; // socket超时(毫秒)
try (Connection connection = DriverManager.getConnection(url, username, password)) {
PreparedStatement preparedStatement = connection.prepareStatement(SQL_TABLE_INFO);
preparedStatement.setString(1, database);
ResultSet resultSet = preparedStatement.executeQuery();
List<TableInfo> tableInfoList = new ArrayList<>();
while (resultSet.next()) {
TableInfo tableInfo = new TableInfo();
tableInfo.setTABLE_NAME(resultSet.getString("TABLE_NAME"));
tableInfo.setTABLE_COMMENT(resultSet.getString("TABLE_COMMENT"));
tableInfo.setTABLE_ROWS(resultSet.getInt("TABLE_ROWS"));
tableInfo.setTABLE_COLUMN(resultSet.getInt("TABLE_COLUMN"));
tableInfoList.add(tableInfo);
} }
System.out.println(tableInfoList);
return tableInfoList;
} catch (Exception e) {
logger.error("连接数据库失败", e);
throw new BusinessException("连接数据库失败");
}
}
public static class TableInfo {
private String TABLE_NAME;
private String TABLE_COMMENT;
private int TABLE_ROWS;
private int TABLE_COLUMN;
public String getTABLE_NAME() {
return TABLE_NAME;
}
public void setTABLE_NAME(String TABLE_NAME) {
this.TABLE_NAME = TABLE_NAME;
}
public String getTABLE_COMMENT() {
return TABLE_COMMENT;
}
public void setTABLE_COMMENT(String TABLE_COMMENT) {
this.TABLE_COMMENT = TABLE_COMMENT;
}
public int getTABLE_ROWS() {
return TABLE_ROWS;
}
public void setTABLE_ROWS(int TABLE_ROWS) {
this.TABLE_ROWS = TABLE_ROWS;
}
public int getTABLE_COLUMN() {
return TABLE_COLUMN;
}
public void setTABLE_COLUMN(int TABLE_COLUMN) {
this.TABLE_COLUMN = TABLE_COLUMN;
}
@Override
public String toString() {
return "TableInfo{" +
"TABLE_NAME='" + TABLE_NAME + '\'' +
", TABLE_COMMENT='" + TABLE_COMMENT + '\'' +
", TABLE_ROWS=" + TABLE_ROWS +
", TABLE_COLUMN=" + TABLE_COLUMN +
'}';
} }
} }
......
package cn.com.poc.knowledge.dto;
import java.io.Serializable;
/**
* @author alex.yao
* @date 2025/4/29
*/
public class BizDatabaseTableInfoDto implements Serializable {
private String tableName;
private String tableComment;
private int tableRows;
private int tableColumn;
public String getTableName() {
return tableName;
}
public void setTableName(String tableName) {
this.tableName = tableName;
}
public String getTableComment() {
return tableComment;
}
public void setTableComment(String tableComment) {
this.tableComment = tableComment;
}
public int getTableRows() {
return tableRows;
}
public void setTableRows(int tableRows) {
this.tableRows = tableRows;
}
public int getTableColumn() {
return tableColumn;
}
public void setTableColumn(int tableColumn) {
this.tableColumn = tableColumn;
}
}
package cn.com.poc.knowledge.rest; package cn.com.poc.knowledge.rest;
import cn.com.poc.knowledge.dto.BizDatabaseTableInfoDto;
import cn.com.poc.knowledge.dto.BizKnowledgeDatabaseDto; import cn.com.poc.knowledge.dto.BizKnowledgeDatabaseDto;
import cn.com.poc.knowledge.dto.DatabaseTestContentDto; import cn.com.poc.knowledge.dto.DatabaseTestContentDto;
import cn.com.poc.knowledge.dto.KnowledgeDatabaseSearchDto; import cn.com.poc.knowledge.dto.KnowledgeDatabaseSearchDto;
...@@ -40,6 +41,14 @@ public interface DatabaseRest extends BaseRest { ...@@ -40,6 +41,14 @@ public interface DatabaseRest extends BaseRest {
*/ */
BizKnowledgeDatabaseDto get(@RequestParam Integer id); BizKnowledgeDatabaseDto get(@RequestParam Integer id);
/**
* 获取数据库连接信息根据ID列表
*
* @param ids
* @return
*/
List<BizKnowledgeDatabaseDto> getByIds(@RequestParam Integer[] ids);
/** /**
* 获取数据库连接信息列表 * 获取数据库连接信息列表
...@@ -66,5 +75,13 @@ public interface DatabaseRest extends BaseRest { ...@@ -66,5 +75,13 @@ public interface DatabaseRest extends BaseRest {
*/ */
BizKnowledgeDatabaseDto update(@RequestBody BizKnowledgeDatabaseDto dto); BizKnowledgeDatabaseDto update(@RequestBody BizKnowledgeDatabaseDto dto);
/**
* 获取数据库表详情信息
*
* @param id 数据库信息ID
* @return 数据库表详情信息列表
*/
List<BizDatabaseTableInfoDto> getTableInfo(@RequestParam Integer id);
} }
\ No newline at end of file
...@@ -5,6 +5,7 @@ import cn.com.poc.common.utils.BlContext; ...@@ -5,6 +5,7 @@ import cn.com.poc.common.utils.BlContext;
import cn.com.poc.common.utils.DatabaseUtil; import cn.com.poc.common.utils.DatabaseUtil;
import cn.com.poc.common.utils.StringUtils; import cn.com.poc.common.utils.StringUtils;
import cn.com.poc.knowledge.convert.BizKnowledgeDatabaseConvert; import cn.com.poc.knowledge.convert.BizKnowledgeDatabaseConvert;
import cn.com.poc.knowledge.dto.BizDatabaseTableInfoDto;
import cn.com.poc.knowledge.dto.BizKnowledgeDatabaseDto; import cn.com.poc.knowledge.dto.BizKnowledgeDatabaseDto;
import cn.com.poc.knowledge.dto.DatabaseTestContentDto; import cn.com.poc.knowledge.dto.DatabaseTestContentDto;
import cn.com.poc.knowledge.dto.KnowledgeDatabaseSearchDto; import cn.com.poc.knowledge.dto.KnowledgeDatabaseSearchDto;
...@@ -80,6 +81,22 @@ public class DatabaseRestImpl implements DatabaseRest { ...@@ -80,6 +81,22 @@ public class DatabaseRestImpl implements DatabaseRest {
return BizKnowledgeDatabaseConvert.entityToDto(bizKnowledgeDatabaseEntity); return BizKnowledgeDatabaseConvert.entityToDto(bizKnowledgeDatabaseEntity);
} }
@Override
public List<BizKnowledgeDatabaseDto> getByIds(Integer[] ids) {
Assert.notEmpty(ids, "id can not be null");
UserBaseEntity userBaseEntity = BlContext.getCurrentUserNotException();
Long userId = userBaseEntity.getUserId();
List<BizKnowledgeDatabaseDto> result = new ArrayList<>();
for (Integer id : ids) {
BizKnowledgeDatabaseEntity bizKnowledgeDatabaseEntity = bizKnowledgeDatabaseService.get(id.longValue());
if (bizKnowledgeDatabaseEntity == null && !bizKnowledgeDatabaseEntity.getMemberId().equals(userId.intValue())) {
continue;
}
result.add(BizKnowledgeDatabaseConvert.entityToDto(bizKnowledgeDatabaseEntity));
}
return result;
}
@Override @Override
public List<BizKnowledgeDatabaseDto> getList(KnowledgeDatabaseSearchDto knowledgeDatabaseSearchDto, PagingInfo pagingInfo) { public List<BizKnowledgeDatabaseDto> getList(KnowledgeDatabaseSearchDto knowledgeDatabaseSearchDto, PagingInfo pagingInfo) {
UserBaseEntity userBaseEntity = BlContext.getCurrentUserNotException(); UserBaseEntity userBaseEntity = BlContext.getCurrentUserNotException();
...@@ -124,4 +141,32 @@ public class DatabaseRestImpl implements DatabaseRest { ...@@ -124,4 +141,32 @@ public class DatabaseRestImpl implements DatabaseRest {
} }
return BizKnowledgeDatabaseConvert.entityToDto(updateEntity); return BizKnowledgeDatabaseConvert.entityToDto(updateEntity);
} }
@Override
public List<BizDatabaseTableInfoDto> getTableInfo(Integer id) {
Assert.notNull(id, "id can not be null");
UserBaseEntity userBaseEntity = BlContext.getCurrentUserNotException();
Long userId = userBaseEntity.getUserId();
BizKnowledgeDatabaseEntity bizKnowledgeDatabaseEntity = bizKnowledgeDatabaseService.get(id.longValue());
if (bizKnowledgeDatabaseEntity == null && !bizKnowledgeDatabaseEntity.getMemberId().equals(userId.intValue())) {
throw new BusinessException("no database found");
}
List<DatabaseUtil.TableInfo> tableInfos = DatabaseUtil.getTableInfo(bizKnowledgeDatabaseEntity.getDbHost(),
bizKnowledgeDatabaseEntity.getDbPort(),
bizKnowledgeDatabaseEntity.getDbUsername(),
bizKnowledgeDatabaseEntity.getDbPassword(),
bizKnowledgeDatabaseEntity.getDbName());
if (CollectionUtils.isEmpty(tableInfos)) {
throw new BusinessException("connection database error");
}
return tableInfos.stream().map(info -> {
BizDatabaseTableInfoDto dto = new BizDatabaseTableInfoDto();
dto.setTableName(info.getTABLE_NAME());
dto.setTableComment(info.getTABLE_COMMENT());
dto.setTableRows(info.getTABLE_ROWS());
dto.setTableColumn(info.getTABLE_COLUMN());
return dto;
}).collect(Collectors.toList());
}
} }
\ No newline at end of file
...@@ -8,6 +8,8 @@ import org.springframework.test.context.ContextConfiguration; ...@@ -8,6 +8,8 @@ import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration; import org.springframework.test.context.web.WebAppConfiguration;
import java.sql.SQLException;
/** /**
* @author alex.yao * @author alex.yao
* @date 2025/4/27 * @date 2025/4/27
...@@ -28,4 +30,14 @@ public class DatabaseUtilTest { ...@@ -28,4 +30,14 @@ public class DatabaseUtilTest {
System.out.println(DatabaseUtil.testConnect(host, port, username, password, database)); System.out.println(DatabaseUtil.testConnect(host, port, username, password, database));
} }
@Test
public void test_getTableInfo() throws SQLException, ClassNotFoundException {
String host = "192.168.21.31";
int port = 3306;
String username = "poc_root";
String password = "8db58a2836dc";
String database = "gsst_poc_sit";
DatabaseUtil.getTableInfo(host, port, username, password, database);
}
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment