MyBatis源码通~StatementHandler&ParameterHandler

本文详细介绍了MyBatis中StatementHandler和ParameterHandler的执行流程。从创建RoutingStatementHandler,包括interceptorChain.pluginAll()方法应用拦截器,到prepareStatement()过程,涉及获取数据库连接、创建PreparedStatement及参数设置。接着讨论SQL执行和结果解析,揭示了MyBatis如何处理SQL执行和参数绑定的内部机制。
摘要由CSDN通过智能技术生成

StatementHandler&ParameterHandler

StatementHandler是连接Mybatis和JDBC之间的桥梁
在这里插入图片描述
在执行SQL之前,StatementHandler需要创建合适的 Statement 对象,然后通过ParameterHandler将参数值填充到 Statement 对象中,最后通过 Statement.execute()执行 SQL。SQL 执行完后,通过ResultSetHandler处理结果。

//-☆☆- SimpleExecutor
public <E> List<E> doQuery(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) throws SQLException {
   
    Statement stmt = null;
    try {
   
      Configuration configuration = ms.getConfiguration();
      //NOTE☆: 创建StatementHandler(创建时会加载配置的拦截器Interceptor)
      StatementHandler handler = configuration.newStatementHandler(wrapper, ms, parameter, rowBounds, resultHandler, boundSql);
      //NOTE☆: 创建Statement(和JDBC开始关联)
      stmt = prepareStatement(handler, ms.getStatementLog());
      //NOTE☆: 调用StatementHandler来真正地执行SQL命令
      return handler.query(stmt, resultHandler);
    } finally {
   
      closeStatement(stmt);
    }
  }

1、 创建RoutingStatementHandler

调用configuration.newStatementHandler创建StatementHandler,实际创建的是RoutingStatementHandler对象,其作用是根据不同的StatementType来进行路由并创建不同的StatementHandler。(相当于一个装饰器模式或者策略模式),Configuration在创建StatementHandler时直接创建RoutingStatementHandler,在其内部用StatementHandler delegate;来记录正在的StatementHandler。后续所有关于StatementHandler的操作都会经过RoutingStatementHandler的相应方法来执行。

1.1、interceptorChain.pluginAll(statementHandler)

加入拦截器Interceptor,会为真正的StatementHandler进行封装,最后返回的是一个代理类(通过工具Plugin.wrap)

见插件Interceptor篇

2、 prepareStatement()

该方法的作用是绑定执行时所需要的实参,即把运行时参数设置到SQL中。

private Statement prepareStatement(StatementHandler handler, Log statementLog) throws SQLException {
   
    Statement stm
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只打杂的码农

你的鼓励是对我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值