14 探究 MyBatis 结果集映射机制背后的秘密(上)
在前面介绍 MyBatis 解析 Mapper.xml 映射文件的过程中,我们看到
标签会被解析成 ResultMap 对象,其中定义了 ResultSet 与 Java 对象的映射规则,简单来说,也就是**一行数据记录如何映射成一个 Java 对象**,这种映射机制是 MyBatis 作为 ORM 框架的核心功能之一。
ResultMap 只是定义了一个静态的映射规则,那在运行时,MyBatis 是如何根据映射规则将 ResultSet 映射成 Java 对象的呢?当 MyBatis 执行完一条 select 语句,**拿到 ResultSet 结果集之后,会将其交给关联的 ResultSetHandler 进行后续的映射处理**。
ResultSetHandler 是一个接口,其中定义了三个方法,分别用来处理不同的查询返回值:
public interface ResultSetHandler { // 将ResultSet映射成Java对象 List handleResultSets(Statement stmt) throws SQLException; // 将ResultSet映射成游标对象 Cursor 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
更多学习
个人 Github
个人公众号
更多实时资讯,前沿技术,生活趣事。尽在【老马啸西风】
交流社群:[交流群信息](https://mp.weixin.qq.com/s/rkSvXxiiLGjl3S-ZOZCr0Q)