数据读写的本质
不管是哪种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组件真正实例化的