mybatis源码解读之executor包语句处理功能

 更新时间:2022年02月15日 17:11:37   作者:灰太狼_cx  
这篇文章主要介绍了executor包语句处理功能,mybatis中支持三种语句类型,不同语句类型支持的变量符号不同,下文详细内容,需要的小伙伴可以参考一下

1.mybatis对多语句类型的支持

mybatis映射文件中传参数,主要用到#{} 或者 ${}.

#{}:表示使用这种符号的变量会以预编译的形式赋值到sql片段中。

${}:表示使用这种符号的变量会以字符串的形式直接插到sql片段中。

mybatis中支持三种语句类型,不同语句类型支持的变量符号不同。mybatis的三种类型如下:

  • STATEMENT:这种语句类型中,只会对sql片段进行简单的字符串拼接。只支持使用${}.
  • PREPARED:这种语句中会先对sql片段进行字符串拼接,然后再对sql片段进行赋值。可以使用#{}和${}.
  • CALLABLE:这种语句用了实现执行过程的调用,会先对sql片段进行字符串拼接,然后对sql片段进行赋值。可以使用#{}和${}.

2.mybatis的语句处理功能

statement子包负责提供语句处理功能,其中StatementHandler是语句功能类的父接口,RoutingStatementHandler类是一个代理类,它能够根据传入的MappedStatement对象的具体类型选中一个具体的被代理对象,然后将所有实际操作都委托给被代理对象。所以RoutingStatementHandler类提供的是路由功能,而路由选择的依据就是语句类型。

public class RoutingStatementHandler implements StatementHandler {

  // 根据语句类型选取出的被代理类的对象
  private final StatementHandler delegate;

  public RoutingStatementHandler(Executor executor, MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) {
    // 根据语句类型选择被代理对象
    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());
    }
  }
}

BaseStatementHandler作为三个实现类的父类,提供了实现类的公共方法。并且BaseStatementHandler类使用的模板模式在prepare方法中定义了整个方法的框架,然后将一些与子类相关的操作交给三个子类处理。

SimpleStatementHandler类、PreparedStatementHandler类和CallableStatementHandler类是三个真正的statement处理器,分别处理statement、preparedStatementCallableStatement对象。通过其中的parameterize方法可以看出三个Statement处理器的不同。

SimpleStatementHandlerparameterize方法的实现为空,因为它只需要完成字符串替换即可,不需要进行参数处理

public class SimpleStatementHandler extends BaseStatementHandler {

 @Override
  public void parameterize(Statement statement) {
    // N/A
  }

  }

PreparedStatementHandlerparameterize方法最终通过ParameterHandler接口经过多级中转后调用了PreparedStatement类中的参数赋值方法。

public class PreparedStatementHandler extends BaseStatementHandler {
  @Override
  public void parameterize(Statement statement) throws SQLException {
    parameterHandler.setParameters((PreparedStatement) statement);
  }
}

CallableStatementHandler中parameterize主要是通过registerOutputParameters方法中转后调用CallableStatement中的输出参数注册方法完成输出参数的注册,然后通过ParameterHandler接口经过多级中转后调用了PreparedStatement类中的参数赋值方法。

public class CallableStatementHandler extends BaseStatementHandler {
 /**
   * 对语句进行参数处理
   * @param statement SQL语句
   * @throws SQLException
   */
  @Override
  public void parameterize(Statement statement) throws SQLException {
    // 输出参数的注册
    registerOutputParameters((CallableStatement) statement);
    // 输入参数的处理
    parameterHandler.setParameters((CallableStatement) statement);
  }

}

到此这篇关于  mybatis源码解读之executor包语句处理功能的文章就介绍到这了,更多相关executor包语句处理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 浅谈静态变量、成员变量、局部变量三者的区别

    浅谈静态变量、成员变量、局部变量三者的区别

    下面小编就为大家带来一篇浅谈静态变量、成员变量、局部变量三者的区别。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-09-09
  • Spring AOP原理及动态代理

    Spring AOP原理及动态代理

    这篇文章主要介绍了Spring AOP原理及动态代理,文章通过围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-09-09
  • java 中内部类的实例详解

    java 中内部类的实例详解

    这篇文章主要介绍了java 中内部类的实例详解的相关资料,希望通过本文能帮助到大家,需要的朋友可以参考下
    2017-09-09
  • java使用CountDownLatch实现多线程协作

    java使用CountDownLatch实现多线程协作

    在多线程编程中,经常需要实现一种机制来协调多个线程的执行,以确保某些操作在所有线程完成后再进行,CountDownLatch 就是 Java 并发包中提供的一种同步工具,下面我们就来看看如何使用CountDownLatch实现多线程协作吧
    2023-11-11
  • 教你Spring如何使用三级缓存解决循环依赖

    教你Spring如何使用三级缓存解决循环依赖

    这篇文章主要介绍了Spring使用三级缓存解决循环依赖的过程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-03-03
  • Java并发编程之Executor接口的使用

    Java并发编程之Executor接口的使用

    今天给大家带来的是关于Java并发编程的相关知识,文章围绕着Executor接口的使用展开,文中有非常详细的介绍及代码示例,需要的朋友可以参考下
    2021-06-06
  • Spring使用@Autowired为抽象父类注入依赖代码实例

    Spring使用@Autowired为抽象父类注入依赖代码实例

    这篇文章主要介绍了Spring使用@Autowired为抽象父类注入依赖代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • Druid简单实现数据库的增删改查方式

    Druid简单实现数据库的增删改查方式

    这篇文章主要介绍了Druid简单实现数据库的增删改查方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • Springmvc国际化自动配置代码实现

    Springmvc国际化自动配置代码实现

    这篇文章主要介绍了Springmvc国际化自动配置代码实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • 使用JVM常用GC日志打印参数

    使用JVM常用GC日志打印参数

    这篇文章主要介绍了使用JVM常用GC日志打印参数,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09

最新评论