前言
根据业务需求需要做动态报表功能,根据前端传入SQL执行后获取结果集,前端传入的SQL不确定 ,所以无法像传统形式根据参数获取结果集,所以SQL执行完,直接返回结果集。
JDBC执行SQL步骤
//1.加载驱动
Class.forName(Driver);
//2.建立连接
Connection connection = DriverManager.getConnection(URL, USER, PASSWORD);
Statement state = connection.createStatement();
//3.执行sql
ResultSet resultSet = state.executeQuery(sql);
//解析数据
while (resultSet.next()) {
···
}
//4.关闭连接
resultSet.close();
state.close();
connection.close();
解析数据
解析数据根据写的sql语句通过下标解析查询结果
直接获取一行数据
通过ResultSet提供的方法getMetaData()获取元数据
可以通过此方法获取行信息
使用
public JSONArray preview(String sql) {
Connection connection = null;
Statement state = null;
ResultSet resultSet = null;
// 创建一个空的JSON数组
JSONArray jsonArray = new JSONArray();
try {
//1.加载驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//2.建立连接
connection = DriverManager.getConnection(URL, USER, PASSWORD);
state = connection.createStatement();
//3.执行sql
resultSet = state.executeQuery(sql);
//获取结果集的元数据
ResultSetMetaData metaData = resultSet.getMetaData();
//获取列的数量
int columnCount = metaData.getColumnCount();
while (resultSet.next()) {
JSONObject jsonObject = new JSONObject();
for (int i = 1; i <= columnCount; i++) {
// 获取列的名称
String columnName = metaData.getColumnName(i);
// 获取列的值
Object columnValue = resultSet.getObject(i);
jsonObject.put(columnName, columnValue);
}
jsonArray.add(jsonObject);
}
} catch (Exception e) {
//报错执行语句
log.error(StrFormatter.format("sql语句拼写错误或数据库连接错误,报错:{}", e.getMessage()));
throw new RunTimeException("sql语句拼写错误或数据库连接错误");
} finally {
try {
//关闭resultSet
if (resultSet != null) {
resultSet.close();
}
} catch (SQLException e) {
//报错执行语句
log.error(StrFormatter.format("resultSet关闭错误,报错:{}", e.getMessage()));
} finally {
try {
//关闭state
if (state != null) {
state.close();
}
} catch (SQLException e) {
log.error(StrFormatter.format("state关闭错误,报错:{}", e.getMessage()));
} finally {
try {
//4.关闭连接
if (connection != null) {
connection.close();
}
} catch (SQLException e) {
//报错执行语句
log.error(StrFormatter.format("connection关闭错误,报错:{}", e.getMessage()));
}
}
}
}
return jsonArray;
}
1.获取元数据
ResultSetMetaData metaData = resultSet.getMetaData();
2.获取列的数量
int columnCount = metaData.getColumnCount();
3.获取列名和值
String columnName = metaData.getColumnName(i);
Object columnValue = resultSet.getObject(i);
4.组装成JSON对象
jsonObject.put(columnName, columnValue);
需要转换具体实体类可以再做处理
5.用JSONArray接收结果集
jsonArray.add(jsonObject);