learn-tech/专栏/深入剖析MyBatis核心原理-完/14探究MyBatis结果集映射机制背后的秘密(上).md
2024-10-16 06:37:41 +08:00

22 KiB
Raw Permalink Blame History

                        因收到Google相关通知网站将会择期关闭。相关通知内容
                        
                        
                        14  探究 MyBatis 结果集映射机制背后的秘密(上)
                        在前面介绍 MyBatis 解析 Mapper.xml 映射文件的过程中,我们看到 <resultMap> 标签会被解析成 ResultMap 对象,其中定义了 ResultSet 与 Java 对象的映射规则,简单来说,也就是一行数据记录如何映射成一个 Java 对象,这种映射机制是 MyBatis 作为 ORM 框架的核心功能之一。

ResultMap 只是定义了一个静态的映射规则那在运行时MyBatis 是如何根据映射规则将 ResultSet 映射成 Java 对象的呢?当 MyBatis 执行完一条 select 语句,拿到 ResultSet 结果集之后,会将其交给关联的 ResultSetHandler 进行后续的映射处理。

ResultSetHandler 是一个接口,其中定义了三个方法,分别用来处理不同的查询返回值:

public interface ResultSetHandler {

// 将ResultSet映射成Java对象

<E> List<E> handleResultSets(Statement stmt) throws SQLException;

// 将ResultSet映射成游标对象

<E> Cursor<E> handleCursorResultSets(Statement stmt) throws SQLException;

// 处理存储过程的输出参数

void handleOutputParameters(CallableStatement cs) throws SQLException;

}

在 MyBatis 中只提供了一个 ResultSetHandler 接口实现,即 DefaultResultSetHandler。下面我们就以 DefaultResultSetHandler 为中心,介绍 MyBatis 中 ResultSet 映射的核心流程。

结果集处理入口

你如果有 JDBC 编程经验的话,应该知道在数据库中执行一条 Select 语句通常只能拿到一个 ResultSet但这只是我们最常用的一种查询数据库的方式其实数据库还支持同时返回多个 ResultSet 的场景,例如在存储过程中执行多条 Select 语句。MyBatis 作为一个通用的持久化框架,不仅要支持常用的基础功能,还要对其他使用场景进行全面的支持。

DefaultResultSetHandler 实现的 handleResultSets() 方法支持多个 ResultSet 的处理(单 ResultSet 的处理只是其中的特例),相关的代码片段如下:

public List