MyBatis SqlSession执行原理总结

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lichunericli/article/details/82563680

MyBatis的四大对象:
Executor执行器:用来调度StatementHandler,ParameterHandler和ResultHandler等来处理对应SQL的执行;
StatementHandler:通过Statement对数据库执行操作;
ParameterHandler:用于对SQL参数的处理,预编译参数的设置;
ResultSetHandler:对数据结果集ResultSet的处理。

1. Executor执行器:执行Java和数据库交互
SimpleExecutor:简易执行器,默认的执行器;
ReuseExecutor:重用预处理语句;
BatchExecutor:批量执行所有更新语句。

2. StatementHandler:数据库会话处理器
RoutingStatementHandler:根据Executor的类型,创建不同的类型StatementHandler;
SimpleStatementHandler:用于没有预编译参数的SQL的运行;
PreparedStatementHandler:用于预编译参数SQL的运行;
CallableStatementHandler:它将实现存储过程的调度。

3. ParameterHandler参数处理器
默认实现是DefaultParameterHandler,它作用于对预编译语句进行参数的设置,把获取到的参数parameterObject与TypeHandler相关联起来,并注册到Configuration中。TypeHandler用于实现JAVA类型和JDBC类型的相互转换,它会根据参数的JAVA类型和JDBC类型来选择合适的TypeHandler,再通过TypeHandler进行参数设置,以此达到JAVA类型到JDBC类型的转换。

4. ResultSetHandler结果处理器
默认实现是DefaultResultSetHandler,主要负责对结果集的处理,有3种处理方式:
结果列表:List<E> handleResultSets(Statement stmt) throws SQLException;
游标列表:Cursor<E> handleCursorResultSets(Statement stmt) throws SQLException;
存储过程处理:void handleOutputParameters(CallableStatement cs) throws SQLException;
备注:游标使用懒加载的方式来提取数据,通常适应于那些不适合在内存进行查询的海量数据的处理,游标SQL查询必须使用resultMap的ID列进行排序(resultorded ="true")。

总结:

MyBatis是通过SqlSession的select/insert/update/delete来实现增删改查的,无论是采用直接执行已映射的SQL语句,还是执行更清晰和类型安全的代码【Mapper接口方法的实现】,究其底层都是通过SqlSession来执行实现的。SqlSession触发Executor的执行,Executor先调用StatementHandler里的prepare方法预编译SQL语句并设置Statement参数,然后再用parameterize方法来使用ParameterHandler设置SQL参数以完成预编译,通过StatementHandler执行对应的操作,使用ResultHandler将结果封装返回给调用者。

猜你喜欢

转载自blog.csdn.net/lichunericli/article/details/82563680