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


Posted in Java/Android onFebruary 15, 2022

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包语句处理内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Java/Android 相关文章推荐
Spring Boot两种全局配置和两种注解的操作方法
Jun 29 Java/Android
spring boot项目application.properties文件存放及使用介绍
Jun 30 Java/Android
详细了解MVC+proxy
Jul 09 Java/Android
SpringBoot+Vue+JWT的前后端分离登录认证详细步骤
Sep 25 Java/Android
alibaba seata服务端具体实现
Feb 24 Java/Android
Java并发编程之原子性-Atomic的使用
Mar 16 Java/Android
关于EntityWrapper的in用法
Mar 22 Java/Android
Android Flutter实现图片滑动切换效果
Apr 07 Java/Android
Android Canvas绘制文字横纵向对齐
Jun 05 Java/Android
Android开发EditText禁止输入监听及InputFilter字符过滤
Jun 10 Java/Android
Spring boot实现上传文件到本地服务器
Aug 14 Java/Android
java获取一个文本文件的编码(格式)信息
Sep 23 Java/Android
java executor包参数处理功能 
Feb 15 #Java/Android
Java如何实现通过键盘输入一个数组
Feb 15 #Java/Android
Java实现给Word文件添加文字水印
Feb 15 #Java/Android
SSM项目使用拦截器实现登录验证功能
Jan 22 #Java/Android
利用Sharding-Jdbc进行分库分表的操作代码
关于MybatisPlus配置双数据库驱动连接数据库问题
Jan 22 #Java/Android
JavaCV实现照片马赛克效果
Jan 22 #Java/Android
You might like
基于win2003虚拟机中apache服务器的访问
2017/08/01 PHP
jQuery ajax BUG:object doesn't support this property or method
2010/07/06 Javascript
判断用户是否在线的代码
2011/03/05 Javascript
JQuery验证工具类搜集整理
2013/01/16 Javascript
Jquery 的outerHeight方法使用介绍
2013/09/11 Javascript
javascript感应鼠标图片透明度显示的方法
2015/02/24 Javascript
Angularjs中如何使用filterFilter函数过滤
2016/02/06 Javascript
jQuery+php实时获取及响应文本框输入内容的方法
2016/05/24 Javascript
JS中with的替代方法与String中的正则方法详解
2016/12/23 Javascript
Vuejs中使用markdown服务器端渲染的示例
2017/11/22 Javascript
JS表单传值和URL编码转换
2018/03/03 Javascript
前后端如何实现登录token拦截校验详解
2018/09/03 Javascript
Vue中的$set的使用实例代码
2018/10/08 Javascript
JQuery判断radio单选框是否选中并获取值的方法
2019/01/17 jQuery
vue-cli3环境变量与分环境打包的方法示例
2019/02/18 Javascript
详解vuex数据传输的两种方式及this.$store undefined的解决办法
2019/08/26 Javascript
Vue router传递参数并解决刷新页面参数丢失问题
2020/12/02 Vue.js
python将html转成PDF的实现代码(包含中文)
2013/03/04 Python
python开发的小球完全弹性碰撞游戏代码
2013/10/15 Python
在Python的Django框架中为代码添加注释的方法
2015/07/16 Python
请不要重复犯我在学习Python和Linux系统上的错误
2016/12/12 Python
Python实现基于TCP UDP协议的IPv4 IPv6模式客户端和服务端功能示例
2018/03/22 Python
使用Eclipse如何开发python脚本
2018/04/11 Python
python实现串口自动触发工作的示例
2019/07/02 Python
HTML5+CSS3应用详解
2014/02/24 HTML / CSS
美国折扣宠物药房:Total Pet Supply
2018/05/27 全球购物
Ibatis如何使用动态表名
2015/07/12 面试题
一道Delphi面试题
2016/10/28 面试题
《台湾的蝴蝶谷》教学反思
2014/02/20 职场文书
总经理工作职责范文
2014/03/14 职场文书
指导教师评语
2014/04/26 职场文书
创先争优标语
2014/06/27 职场文书
公司活动总结范文
2014/07/01 职场文书
听证会主持词
2015/07/03 职场文书
MySQL数据库10秒内插入百万条数据的实现
2021/11/01 MySQL
浅谈mysql哪些情况会导致索引失效
2021/11/20 MySQL