MyBatis四大组件之 ParameterHandlers

MyBatis 四大核心组件之ParameterHandlers,使用 ParameterHandler 进行参数配置

ParameterHandler 译为参数处理器,负责为 PreparedStatement 的 sql 语句参数动态赋值,这个接口很简单只有两个方法

ParameterHandler 只有一个实现类DefaultParameterHandler, 它实现了这两个方法。

getParameterObject:用于读取参数

setParameters: 用于对 PreparedStatement 的参数赋值


创建ParameterHandler 时机是BaseStatementHandler的初始化时候。

在创建 ParameterHandler 时,需要传入SQL的mappedStatement 对象,读取的参数和SQL语句

注意:一个 BoundSql 对象,就代表了一次sql语句的实际执行,而 SqlSource 对象的责任,就是根据传入的参数对象,动态计算这个 BoundSql, 也就是 Mapper 文件中节点的计算,是由 SqlSource 完成的,SqlSource 最常用的实现类是 DynamicSqlSource

Configuration.java

上面是 Configuration 创建 ParameterHandler 的过程,它实际上是交由 LanguageDriver 来创建具体的参数处理器,LanguageDriver 默认的实现类是 XMLLanguageDriver,由它调用 DefaultParameterHandler 中的构造方法完成 ParameterHandler 的创建工作

上面的流程是创建 ParameterHandler 的过程,创建完成之后该进行具体的解析工作,那么 ParameterHandler 如何解析SQL中的参数呢?SQL中的参数从哪里来的?

ParameterHandler 中的参数从何而来

例子:

我们下面就来探讨一下ParameterHandler对参数的解析,这其中涉及到 MyBatis 中的动态代理模式

在MyBatis 中,当deptDao.findByDeptNo(1)将要执行的时候,会被 JVM 进行拦截,交给 MyBatis 中的代理实现类 MapperProxy 的 invoke 方法中,这也是执行 SQL 语句的主流程。


然后交给 Executor 、StatementHandler进行对应的参数解析和执行,因为是带参数的 SQL 语句,最终会创建 PreparedStatement 对象并创建参数解析器进行参数解析。

参考MyBatis 四大组件之StatementHandler文章可知

doQuery, doUpdate, doQueryCursor等方法都会先调用到    

handler.parameterize(stmt) 最终会调用到 DefaultParameterHandler 中的 setParameters 方法,以下是对此方法解读,留意红色框框与JDBC原代码比较。



你可能感兴趣的:(MyBatis四大组件之 ParameterHandlers)