返回

解读 MyBatis ResultSetHandler 解析结果集过程(一)

后端







## MyBatis 结果集解析概述

MyBatis 在执行查询后,需要将底层数据库返回的结果集转换成 Java 对象,以便应用程序使用。这个转换过程称为结果集解析。MyBatis 通过 ResultSetHandler 来完成这项任务。ResultSetHandler 是一种策略设计模式,允许 MyBatis 在不改变核心代码的情况下,根据不同的需求使用不同的结果集解析策略。

## ResultSetHandler 解析过程(阶段一)

ResultSetHandler 的解析过程可以分为两个阶段:

1. 第一个阶段:将底层数据库返回的结果集转换成一个临时对象。这个临时对象通常是一个 Map 或一个 POJO 对象。
2. 第二个阶段:将临时对象转换成一个 Java 对象。这个 Java 对象可以是 POJO 对象、DTO 对象或其他类型的对象。

本篇文章主要介绍第一个阶段的解析过程。

### 阶段一:将结果集转换成临时对象

在第一个阶段,ResultSetHandler 首先会创建一个临时对象。这个临时对象通常是一个 Map 或一个 POJO 对象。

* **Map 对象:** Map 对象是一种键值对数据结构,可以用来存储查询结果的列名和列值。
* **POJO 对象:** POJO 对象是一种普通的 Java 对象,其属性与查询结果的列一一对应。

ResultSetHandler 将查询结果中的一行数据转换成一个临时对象。这个过程通常是通过反射来完成的。反射是一种允许 Java 程序动态获取和修改类信息的技术。ResultSetHandler 使用反射来获取 POJO 对象的属性信息,然后将查询结果中的列值赋值给相应的属性。

### 阶段一实例

```java
public class SimpleResultSetHandler implements ResultSetHandler {

    @Override
    public List<Object> handleResultSets(Statement stmt) throws SQLException {
        List<Object> results = new ArrayList<>();

        ResultSet rs = stmt.getResultSet();
        while (rs.next()) {
            // 创建一个 Map 对象来存储查询结果的列名和列值
            Map<String, Object> row = new HashMap<>();

            // 获取查询结果中所有列的列名
            ResultSetMetaData metaData = rs.getMetaData();
            int columnCount = metaData.getColumnCount();

            // 循环遍历所有列,将列名和列值存储到 Map 对象中
            for (int i = 1; i <= columnCount; i++) {
                String columnName = metaData.getColumnName(i);
                Object columnValue = rs.getObject(i);

                row.put(columnName, columnValue);
            }

            // 将 Map 对象添加到 results 列表中
            results.add(row);
        }

        return results;
    }
}

这段代码演示了如何使用 ResultSetHandler 将查询结果转换成一个 List 对象。

阶段二简介

在第二个阶段,ResultSetHandler 将临时对象转换成一个 Java 对象。这个 Java 对象可以是 POJO 对象、DTO 对象或其他类型的对象。

第二个阶段的解析过程将在下一篇文章中详细介绍。

总结

本篇文章介绍了 MyBatis ResultSetHandler 的解析过程(阶段一)。我们了解到,在第一个阶段,ResultSetHandler 将查询结果转换成一个临时对象。这个临时对象通常是一个 Map 或一个 POJO 对象。

在下一篇文章中,我们将介绍第二个阶段的解析过程,并详细介绍如何将临时对象转换成一个 Java 对象。敬请期待!