在configuration.newStatementHandler()中,new 一个StatementHandler,先得到RoutingStatementHandler。

RoutingStatementHandler 里面没有任何的实现, 是用来创建基本的StatementHandler 的。这里会根据MappedStatement 里面的statementType 决定StatementHandler 的类型。默认是PREPARED ( STATEMENT 、PREPARED 、CALLABLE)。

switch (ms.getStatementType()) {case STATEMENT:delegate = new SimpleStatementHandler(executor, ms, parameter, rowBounds, resultHandler,boundSql);break;case PREPARED:delegate = new PreparedStatementHandler(executor, ms, parameter, rowBounds,resultHandler, boundSql);break;case CALLABLE:delegate = new CallableStatementHandler(executor, ms, parameter, rowBounds,resultHandler, boundSql);break;default:throw new ExecutorException("Unknown statement type: " + ms.getStatementType());
}

StatementHandler 里面包含了处理参数的ParameterHandler 和处理结果集的ResultSetHandler。

这两个对象都是在上面new 的时候创建的。

this.parameterHandler = configuration.newParameterHandler(mappedStatement,
parameterObject, boundSql);
this.resultSetHandler = configuration.newResultSetHandler(executor, mappedStatement,
rowBounds, parameterHandler, resultHandler, boundSql);

这三个对象都是可以被插件拦截的四大对象之一,所以在创建之后都要用拦截器进行包装的方法。

statementHandler = (StatementHandler) interceptorChain.pluginAll(statementHandler);
parameterHandler = (ParameterHandler) interceptorChain.pluginAll(parameterHandler);
resultSetHandler = (ResultSetHandler) interceptorChain.pluginAll(resultSetHandler);

PS:四大对象还有一个是谁?在什么时候创建的?(Executor)

SimpleExecutor.doQuery()-创建StatementHandler相关推荐

  1. SimpleExecutor.doQuery()-创建Statement

    用new 出来的StatementHandler 创建Statement 对象--prepareStatement()方法对语句进行预编译,处理参数. handler.parameterize(stm ...

  2. SimpleExecutor.doQuery()-执行的StatementHandler 的query()方法

    RoutingStatementHandler 的query()方法. delegate 委派,最终执行PreparedStatementHandler 的query()方法.

  3. SimpleExecutor.doQuery()-ResultSetHandler 处理结果集

    return resultSetHandler.handleResultSets(ps); 问题:怎么把ResultSet 转换成List<Object>? ResultSetHandle ...

  4. MyBatis 插件原理与自定义插件-代理和拦截是怎么实现的?

    问题1:四大对象什么时候被代理,也就是:代理对象是什么时候创建的? 问题2:多个插件的情况下,代理能不能被代理?代理顺序和调用顺序的关系? 问题3:谁来创建代理对象? 问题4:被代理后,调用的是什么方 ...

  5. mybatis核心配置_MyBatis 核心配置综述之StatementHandler

    StatementHandler 是四大组件中最重要的一个对象,负责操作 Statement 对象与数据库进行交流,在工作时还会使用 ParameterHandler 和 ResultSetHandl ...

  6. MyBatis源码-解读Executor的三个实现类之SimpleExecutor(简单执行器)

    文章目录 Pre Executor 执行器 接口继承关系 SimpleExecutor(简单执行器) 入门小demo 实例化SimpleExecutor doQuery方法 Pre MyBatis源码 ...

  7. 记一次网络波动导致druid连接池无法创建新连接的BUG

    背景 项目使用了阿里druid jdbc连接池.某天环境出现网络波动,持续20分钟后,网络恢复,单服务一直无法连接数据库.重启之后正常运行 druid 版本:1.1.21 项目配置 spring.da ...

  8. java的工作原理你知道吗_每天用Mybatis,但是Mybatis的工作原理你真的知道吗?

    近来想写一个mybatis的分页插件,但是在写插件之前肯定要了解一下mybatis具体的工作原理吧,于是边参考别人的博客,边看源码就开干了. 核心部件:SqlSession Executor Stat ...

  9. MyBatis 的工作原理,你了解过吗?

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 来源:cnblogs.com/scuury/p/10371 ...

最新文章

  1. 古老的SSM企业级应用
  2. Redis概述与Redis集群(一)
  3. 挺个性的jQuery返回底部、返回顶部特效
  4. http --- http与https相关概念小结
  5. 剑指Offer-- 二维数组中的查找
  6. django-中间件的执行流程
  7. nginx解析php详细教程,Nginx与PHP交互过程步骤详解
  8. java JDK11对比JDK8
  9. android TextToSpeech 静音时仍然播放声音
  10. java手动销毁对象_java对象的销毁详解
  11. Knowledge Distillation via Route Constrained Optimization
  12. URL中 # ? 是什么意思
  13. java String类型的处理
  14. 如何区分PNP型和NPN型?
  15. 【软件测试】测试人,我们35岁焦虑怎样破?
  16. 酷派Y60-C1官方ROM内容解析
  17. Node.js基础2 fs方法和path方法的使用
  18. 内存映射文件之剖析(一)
  19. AutoGluon-教程1-简单的入门模型
  20. INH-RFP-BSA-NPs载INH和RFP白蛋白纳米粒/载卡巴他赛的白蛋白纳米粒的制备

热门文章

  1. asp.net2.0密码强度验证
  2. IT项目管理中如何应对预算削减的难题?
  3. Java 8系列之重新认识HashMap(转载自美团点评技术团队)
  4. python3.6+qt designer一系列配置
  5. python实现定时发送qq消息
  6. C# DateTimePicker控件设置空时间
  7. Python爬虫人工智能大数据全栈视频史上最全合辑教程分享!
  8. 25、【华为HCIE-Storage】--Hyper Snapshot(文件业务)
  9. 把日出拍成大片的手机!大光圈+黑白彩色双摄到底有多强?
  10. Android Studio在线安装Android SDK注意事项