😊 @ 作者: 一恍过去
🎊 @ 社区: Java技术栈交流
🎉 @ 主题: Java+RestltData获取数据库、数据库表、表字段、执行sql等数据源操作
⏱️ @ 创作时间: 2022年03月15日
前言
在Java中,“RestltData"并不是一个标准的类或接口。根据您提供的信息,我假设您指的是"ResultData”,这可能是您在项目中定义的一个自定义类或者是某个框架、库中提供的类。
通常情况下,"ResultData"是用于封装在Web应用程序中返回给客户端的结果数据的对象。它可以包含请求的处理结果、错误信息、状态码等信息,以便客户端能够根据这些信息进行适当的处理和响应。
"ResultData"的意义在于提供了一种结构化的方式来传递响应数据,并可以统一处理和封装常见的响应元素,例如成功或失败的状态、返回的数据对象、错误消息等。这样可以使代码更加清晰、可维护,并且方便客户端对返回结果进行解析和处理。
通过使用"ResultData",开发人员可以定义一致的响应格式,并将其应用于整个项目中的各个接口。这样,客户端可以更轻松地解析和处理响应,并根据状态码和消息进行相应的处理逻辑。"ResultData"在Java Web应用程序中扮演了封装和传递响应数据的角色,使得响应的处理更加一致和规范化,并提供了方便的方式来传递状态、消息和数据等信息给客户端。
通常,一个"ResultData"类可能包含以下属性:
- 状态码(Status Code): 表示请求的处理结果状态,例如200表示成功、404表示资源未找到、500表示服务器错误等。
- 消息(Message): 提供与状态码相关的描述性消息,用于向客户端提供更多的信息。
- 数据(Data): 可能包含响应的业务数据对象,例如从数据库查询的结果或其他需要传递给客户端的数据。
- 其他元数据(Additional Metadata): 可能包含其他自定义的元数据,以满足具体的业务需求。
1、数据源公共类封装
该类用于进行数据源的连接操作,作为一个公共类
GetDataSourceService :
public class GetDataSourceService {
public static DataSource getSource() {
// 实际开发中,可以从数据库中获取数据源的配置项
DataSource dataSource = new DataSource();
dataSource.setId("123");
dataSource.setName("测试");
dataSource.setDatabaseName("template");
dataSource.setDatabaseType(DataBaseTypeConstant.MYSQL);
dataSource.setAddress("127.0.0.1");
dataSource.setPort("3307");
dataSource.setUsername("root");
dataSource.setPassword("lhzlx");
return dataSource;
}
}
JdbcSourcePoolServer:
public class JdbcSourcePoolServer {
/**
* 在SpringBoot项目中,将数据连接池存在线程中,避免没有重新连接
* 可以打断点进行测试,会发现只有执行‘testConn’方法时需要重新进行连接,其他几个方法都是直接在线程的connPol中获取连接
*/
private static ConcurrentHashMap<String, HikariDataSource> connPol = new ConcurrentHashMap<>();
/**
* 配置数据池连接
*
* @param sourceId
* @return
*/
public static Connection getConnection(String sourceId) {
//创建连接池
Connection conn = null;
HikariDataSource ds = null;
try {
sourceId = sourceId == null ? "" : sourceId;
//查询当前数据源是否存在连接
if (connPol.get(sourceId) != null) {
conn = connPol.get(sourceId).getConnection();
} else {
//基本参数4个
DataSource source = GetDataSourceService.getSource();
//获取DruidDataSource配置
ds = JDBCUtil.getDruidSource(source);
//获取连接
conn = ds.getConnection();
//将数据源连接池存入Map中
connPol.put(source.getId(), ds);
}
if (conn == null) {
throw new Exception();
}
return conn;
} catch (Exception e) {
JDBCUtil.closeDataSource(ds);
e.printStackTrace();
return null;
}
}
/**
* SQL查询
*
* @param sourceId
* @param sql
* @param limit
* @return
*/
public static SqlResult searchSql(String sourceId, String sql, int limit) {
//默认预览条数
sql = sql + " limit " + limit;
//存放字段名称
List<String> cellHeader = null;
//存放字段类型
Map<String, String> colType = null;
//存放字段值集合
List<Object> cellList = new ArrayList<>();
try {
//获取链接
Connection conn = getConnection(sourceId);
//执行sql
PreparedStatement pstmt = conn.prepareStatement(sql);
ResultSet rs = pstmt.executeQuery();
ResultSetMetaData metaData = rs.getMetaData();
//遍历结果集
while (rs.next()) {
cellHeader = new ArrayList<>();
colType = new HashMap<>();
Map<Object, Object> valueMap = new HashMap<>();
//rs的下标只能从1开始
for (int i = 1; i <= metaData.getColumnCount(); i++) {
//获取字段名称,只获取一次
cellHeader.add(metaData.getColumnName(i));
//获取当前字段的类型
metaData.getColumnTypeName(i);
colType.put(metaData.getColumnName(i), metaData.getColumnTypeName(i));
//获取值
Object value = rs.getObject(i) == null ? "" : rs.getObject(i);
valueMap.put(i, value);
}
cellList.add(valueMap);
}
JDBCUtil.closeConnection(conn);
rs.close();
//封装数据返回给前端
SqlResult resultVo = new SqlResult();
resultVo.setCellHeader(cellHeader);
resultVo.setCellList(cellList);
resultVo.setColType(colType);
return resultVo;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* 关闭对应数据源的连接池
*
* @param sourceId
*/
public static void destroyDataSource(String sourceId) {
HikariDataSource dataSource = connPol.get(sourceId);
if (dataSource != null) {
connPol.remove(sourceId);
JDBCUtil.closeDataSource(dataSource);
}
}
}
2、连接数据源
private static void testConn() {
DataSource source = GetDataSourceService.getSource();
Connection connection = JdbcSourcePoolServer.getConnection(source.getId());
if (connection != null) {
System.out.println("----- 测试连接成功 -----");
}
}
3、获取数据列表
private static void getCatalogs() {
DataSource source = GetDataSourceService.getSource();
try {
List<String> catList = new ArrayList<>();
Connection conn = JdbcSourcePoolServer.getConnection(sourceId);
if (conn == null) {
System.out.println("----- 连接失败 -----");
return;
}
ResultSet rs = conn.getMetaData().getCatalogs();
while (rs.next()) {
catList.add(rs.getString("TABLE_CAT"));
}
for (String cat : catList) {
System.out.println("-----数据库名称:" + cat + " -----");
}
JDBCUtil.closeConnection(conn);
} catch (Exception e) {
e.printStackTrace();
}
}
4、获取指定数据库中的表
private static List<TableInfoVo> getTables() {
DataSource source = GetDataSourceService.getSource();
try {
Connection conn = JdbcSourcePoolServer.getConnection(sourceId);
if (conn == null) {
System.out.println("----- 连接失败 -----");
return null;
}
List<TableInfoVo> tabList = new ArrayList<>();
String[] types = new String[]{"TABLE", "VIEW"};
//也可以指定要查询表的数据库名称
ResultSet rs = conn.getMetaData().getTables(conn.getCatalog(), conn.getSchema(), "%", types);
JDBCUtil.closeConnection(conn);
System.out.println("----- 表数据: -----");
while (rs.next()) {
TableInfoVo infoVo = new TableInfoVo();
String tableName = rs.getString("TABLE_NAME");
String desc = rs.getString("REMARKS");
infoVo.setName(tableName);
infoVo.setComment(desc);
tabList.add(infoVo);
System.out.println(infoVo);
}
JDBCUtil.closeConnection(conn);
return tabList;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
5、获取指定表中字段信息
private static void getColumns() {
String tabName = "sys_account";
DataSource source = GetDataSourceService.getSource();
try {
Connection conn = JdbcSourcePoolServer.getConnection(sourceId);
if (conn == null) {
System.out.println("----- 连接失败 -----");
return;
}
List<TableInfoVo> colList = new ArrayList<>();
ResultSet rs = conn.getMetaData().getColumns(conn.getCatalog(), conn.getSchema(), tabName, "%");
JDBCUtil.closeConnection(conn);
System.out.println("----- 字段数据: -----");
while (rs.next()) {
TableInfoVo infoVo = new TableInfoVo();
String columnName = rs.getString("COLUMN_NAME");
String typeName = rs.getString("TYPE_NAME");
String desc = rs.getString("REMARKS");
infoVo.setName(columnName);
infoVo.setComment(desc);
infoVo.setColumnType(typeName);
colList.add(infoVo);
System.out.println(infoVo);
}
JDBCUtil.closeConnection(conn);
} catch (Exception e) {
e.printStackTrace();
}
}
6、执行SQL语句
private static void searchSql() {
String sql= "select * from sys_account";
int limit = 10;
DataSource source = GetDataSourceService.getSource();
SqlResult result = JdbcSourcePoolServer.searchSql(sourceId, sql, );
System.out.println("----- SQL预览: -----");
System.out.println(result);
}
7、源码下载
《Demo传送门》