MyBatis 四大组件之ResultSetHandler

MyBatis 四大核心配置之 ResultSetHandler

ResultSetHandler 简介

一条 SQL 的请求过程会经过哪几个步骤? 首先会经过 Executor 执行器,它主要负责管理创建 StatementHandler 对象,然后由 StatementHandler 对象做数据库的连接以及生成 Statement 对象,并解析 SQL 参数,由 ParameterHandler 对象负责把 Mapper 方法中的参数映射到 XML 中的 SQL 语句中,那么是不是还少了一个步骤,就能完成一个完整的 SQL 请求了?没错,这最后一步就是 SQL 结果集的处理工作,也就是 ResultSetHandler 的主要工作。

要了解 ResultSetHandler 之前,首先需要了解 ResultSetHandler的继承关系以及基本方法

ResultSetHandler是一个接口,它只有一个默认的实现类,像是 ParameterHandler 一样,它的默认实现类是DefaultResultSetHandler

ResultSetHandler 创建

ResultSetHandler 是在处理查询请求的时候由 Configuration 对象负责创建,示例如下


ResultSetHandler 处理结果映射

我们在进行传统crud操作的时候,哪些方法是需要返回值的?当然我们说的返回值指的是从数据库中查询出来的值,而不是标识符,应该只有查询方法吧?所以 MyBatis 只针对 query 方法做了返回值的映射,代码如下:

使用时机:

PreparedStatementHandler.java



CallableStatementHandler.java 处理存储过程的SQL



DefaultResultSetHandler 源码解析

MyBatis 只有一个默认的实现类就是 DefaultResultSetHandler,ResultSetHandler 主要负责处理两件事

处理 Statement 执行后产生的结果集,生成结果列表

处理存储过程执行后的输出参数

按照 Mapper 文件中配置的 ResultType 或 ResultMap 来封装成对应的对象,最后将封装的对象返回即可。



其中涉及的主要对象有:

ResultSetWrapper : 结果集的包装器,主要针对结果集进行的一层包装,它的主要属性有

ResultSet : Java JDBC ResultSet接口表示数据库查询的结果。 有关查询的文本显示了如何将查询结果作为java.sql.ResultSet返回。 然后迭代此ResultSet以检查结果。

TypeHandlerRegistry: 类型注册器,TypeHandlerRegistry 在初始化的时候会把所有的 Java类型和类型转换器进行注册。

ColumnNames: 字段的名称,也就是查询操作需要返回的字段名称

ClassNames: 字段的类型名称,也就是 ColumnNames 每个字段名称的类型

JdbcTypes: JDBC 的类型,也就是java.sql.Types 类型

ResultMap: 负责处理更复杂的映射关系

multipleResults:

其中的主要方法是 handleResultSet


handleResultSets 方法返回的是 collapseSingleResultList(multipleResults) ,它是什么呢?

privateListcollapseSingleResultList(List multipleResults){

  return multipleResults.size() == 1 ? (List) multipleResults.get(0) : multipleResults;

}


下面我们来看一下返回的真实实现类 DefaultResultSetHandler 中的结构组成


你可能感兴趣的:(MyBatis 四大组件之ResultSetHandler)