数据读写的本质
不管是哪种ORM框架,数据读写其本质都是对JDBC的封装,其目的主要都是简化JDBC的开发流程,进而让开发人员更关注业务。下面是JDBC的核心流程:
-
注册 JDBC 驱动(Class.forName("XXX");)
-
打开连接(DriverManager.getConnection("url","name","password"))
-
根据连接,创建 Statement(conn.prepareStatement(sql))
-
设置参数(stmt.setString(1, "wyf");)
-
执行查询(stmt.executeQuery();)
-
处理结果,结果集映射(resultSet.next())
-
关闭资源(finally)
Mybatis也是在对JDBC进行封装,它将注册驱动和打开连接交给了数据库连接池来负责,Mybatis支持第三方数据库连接池,也可以使用自带的数据库连接池;创建 Statement 和执行查询交给了StatementHandler来负责;设置参数交给ParameterHandler来负责;最后两步交给了ResultSetHandler来负责。
Executor内部运作过程
“测试方法
org.apache.ibatis.binding.BindingTest#shouldFindThreeSpecificPosts
下面是一个简单的数据读写过程,我们在宏观上先来了解一下每一个组件在整个数据读写上的作用:

Mybatis的数据读写主要是通Excuter来协调StatementHandler、ParameterHandler和ResultSetHandler三个组件来实现的:
-
StatementHandler:它的作用是使用数据库的Statement或PrepareStatement执行操作,启承上启下作用;
-
ParameterHandler:对预编译的SQL语句进行参数设置,SQL语句中的的占位符“?”都对应BoundSql.parameterMappings集合中的一个元素,在该对象中记录了对应的参数名称以及该参数的相关属性
-
ResultSetHandler:对数据库返回的结果集(ResultSet)进行封装,返回用户指定的实体类型;
StatementHandler
StatementHandler类图

RoutingStatementHandler
通过StatementType来创建StatementHandler,使用静态代理模式来完成方法的调用,主要起到路由作用。它是Excutor组件真正实例化的组件。
public class RoutingStatementHandler implements StatementHandler {
/**
* 静态代理模式
*/
private final StatementHandler delegate;
public RoutingStatementHandler(Executor executor, MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) {
// 根据{@link org.apache.ibatis.mapping.StatementType} 来创建不同的实现类 (策略模式)
switch (ms.getStatementType()) {
case STATEMENT:
delegate = new SimpleStatementHandler(executor, ms, parameter, rowBounds, resultHandler, boundSql);
break;
case PREPARED:
delegate = new PreparedStatementHandler(executor, ms, param

本文深入剖析了Mybatis中的数据读写过程,从数据读写的本质出发,详细介绍了Executor的内部运作,包括StatementHandler、ParameterHandler和ResultSetHandler的作用。讲解了StatementHandler的类图及各子类功能,如RoutingStatementHandler、SimpleStatementHandler、PreparedStatementHandler和CallableStatementHandler。同时,阐述了ParameterHandler如何设置参数以及TypeHandler对参数和结果值的处理。最后,概述了ResultSetHandler对数据库结果集的封装和映射机制,并给出了数据读取流程图。
最低0.47元/天 解锁文章

1万+

被折叠的 条评论
为什么被折叠?



