ResultSet 解析

假设你有一个名为 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_idfirst_namelast_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_idfirst_namelast_namesalary。我们可以使用 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();
            }
        }
    }
}

这样,无论查询的表有多少列,都可以自动获取列的数量和列的名称。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值