假设你有一个名为 employees
的表,表结构如下:
CREATE TABLE employees (
employee_id INT PRIMARY KEY,
first_name VARCHAR(50),
last_name VARCHAR(50),
salary DOUBLE
);
INSERT INTO employees (employee_id, first_name, last_name, salary) VALUES
(1, 'John', 'Doe', 50000.00),
(2, 'Jane', 'Smith', 60000.00),
(3, 'Bob', 'Johnson', 55000.00),
(4, 'Alice', 'Williams', 70000.00);
这个表包含了一些员工的信息,每个员工有一个唯一的 employee_id
,first_name
和 last_name
表示员工的名字,salary
表示员工的工资。
在JDBC(Java Database Connectivity)中,ResultSet
通常用于表示数据库查询的结果集。为了方便处理查询结果,经常会将 ResultSet
转化为 List<Map<String, Object>>
的数据结构。下面是对这个数据结构的介绍以及一个数据库查询的简单例子:
1. Map List(Map 集合的列表)
List<Map<String, Object>>
是一个列表,其中每个元素都是一个 Map
集合。每个 Map
集合代表查询结果中的一行数据,而 Map
的键是列名,值是该行中对应列的数值。
- List: 表示整个结果集,每个元素都是一行数据。
- Map: 表示一行数据,其中键是列名,值是该列的数据。
2. 数据库查询例子
假设我们有一个名为 employees
的表,包含以下列:employee_id
、first_name
、last_name
、salary
。我们可以使用 JDBC 连接到数据库并查询这个表,将结果转换为 List<Map<String, Object>>
结构。
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class JdbcExample {
public static void main(String[] args) {
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
try {
// JDBC连接数据库
String jdbcUrl = "jdbc:mysql://localhost:3306/your_database";
String username = "your_username";
String password = "your_password";
connection = DriverManager.getConnection(jdbcUrl, username, password);
// 准备 SQL 查询语句
String sql = "SELECT * FROM employees";
preparedStatement = connection.prepareStatement(sql);
// 执行查询,获取结果集
resultSet = preparedStatement.executeQuery();
// 将 ResultSet 转换为 List<Map<String, Object>>
List<Map<String, Object>> resultList = new ArrayList<>();
while (resultSet.next()) {
Map<String, Object> row = new HashMap<>();
row.put("employee_id", resultSet.getInt("employee_id"));
row.put("first_name", resultSet.getString("first_name"));
row.put("last_name", resultSet.getString("last_name"));
row.put("salary", resultSet.getDouble("salary"));
resultList.add(row);
}
// 处理结果集
for (Map<String, Object> row : resultList) {
System.out.println("Employee ID: " + row.get("employee_id"));
System.out.println("First Name: " + row.get("first_name"));
System.out.println("Last Name: " + row.get("last_name"));
System.out.println("Salary: " + row.get("salary"));
System.out.println("---------------------------");
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 关闭资源
try {
if (resultSet != null) resultSet.close();
if (preparedStatement != null) preparedStatement.close();
if (connection != null) connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
这个例子中,resultList
是一个 List<Map<String, Object>>
结构,每个 Map
包含了一行查询结果的数据。在实际应用中,你可以根据需要选择性地处理和使用这些数据。
自动获取列的数量和列的名称。
你可以使用 ResultSetMetaData
接口来获取结果集的元数据,包括列的数量和列的名称。以下是修改后的代码:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class JdbcExample {
public static void main(String[] args) {
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
try {
// JDBC连接数据库
String jdbcUrl = "jdbc:mysql://localhost:3306/your_database";
String username = "your_username";
String password = "your_password";
connection = DriverManager.getConnection(jdbcUrl, username, password);
// 准备 SQL 查询语句
String sql = "SELECT * FROM employees";
preparedStatement = connection.prepareStatement(sql);
// 执行查询,获取结果集
resultSet = preparedStatement.executeQuery();
// 获取结果集的元数据
ResultSetMetaData metaData = resultSet.getMetaData();
int columnCount = metaData.getColumnCount();
// 将 ResultSet 转换为 List<Map<String, Object>>
List<Map<String, Object>> resultList = new ArrayList<>();
while (resultSet.next()) {
Map<String, Object> row = new HashMap<>();
for (int i = 1; i <= columnCount; i++) {
String columnName = metaData.getColumnName(i);
Object value = resultSet.getObject(i);
row.put(columnName, value);
}
resultList.add(row);
}
// 处理结果集
for (Map<String, Object> row : resultList) {
for (Map.Entry<String, Object> entry : row.entrySet()) {
System.out.println(entry.getKey() + ": " + entry.getValue());
}
System.out.println("---------------------------");
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 关闭资源
try {
if (resultSet != null) resultSet.close();
if (preparedStatement != null) preparedStatement.close();
if (connection != null) connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
这样,无论查询的表有多少列,都可以自动获取列的数量和列的名称。