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 Cache和EhCache实现缓存管理方式
Jun 15 Java/Android
Java数据结构之链表相关知识总结
Jun 18 Java/Android
详解java如何集成swagger组件
Jun 21 Java/Android
SpringBoot集成Redis,并自定义对象序列化操作
Jun 22 Java/Android
springboot项目以jar包运行的操作方法
Jun 30 Java/Android
mybatis 解决从列名到属性名的自动映射失败问题
Jun 30 Java/Android
mybatis中注解与xml配置的对应关系和对比分析
Aug 04 Java/Android
Springboot如何同时装配两个相同类型数据库
Nov 17 Java/Android
Android自定义scrollview实现回弹效果
Apr 01 Java/Android
Java 中的 Lambda List 转 Map 的多种方法详解
Jul 07 Java/Android
SpringBoot详解整合Redis缓存方法
Jul 15 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
PHP错误和异长常处理总结
2014/03/06 PHP
PHP的Laravel框架结合MySQL与Redis数据库的使用部署
2016/03/21 PHP
YII2框架中使用RBAC对模块,控制器,方法的权限控制及规则的使用示例
2020/03/18 PHP
js 字符串转化成数字的代码
2011/06/29 Javascript
javascript检查表单数据是否改变的方法
2013/07/30 Javascript
JS限制Textarea文本域字符个数的具体实现
2013/08/02 Javascript
解决使用bootstrap的dropdown部件时报错:error:Bootstrap dropdown require Popper.js问题
2018/08/30 Javascript
Vue常见面试题整理【值得收藏】
2018/09/20 Javascript
vue-week-picker实现支持按周切换的日历
2019/06/26 Javascript
Angular 中使用 FineReport不显示报表直接打印预览
2019/08/21 Javascript
vue中监听返回键问题
2019/08/28 Javascript
vue 通过绑定事件获取当前行的id操作
2020/07/27 Javascript
TypeScript 运行时类型检查补充工具
2020/09/28 Javascript
简析Python的闭包和装饰器
2016/02/26 Python
Python自动化部署工具Fabric的简单上手指南
2016/04/19 Python
Django返回json数据用法示例
2016/09/18 Python
利用Python爬虫给孩子起个好名字
2017/02/14 Python
python实现字典(dict)和字符串(string)的相互转换方法
2017/03/01 Python
Python SVM(支持向量机)实现方法完整示例
2018/06/19 Python
python爬虫之线程池和进程池功能与用法详解
2018/08/02 Python
python 为什么说eval要慎用
2019/03/26 Python
基于Python检测动态物体颜色过程解析
2019/12/04 Python
css 元素选择器的简单实例
2016/05/23 HTML / CSS
HTML5离线缓存在tomcat下部署可实现图片flash等离线浏览
2012/12/13 HTML / CSS
分享全球十款超强HTML5开发工具
2014/05/14 HTML / CSS
检测浏览器对HTML5和CSS3支持度的方法
2015/06/25 HTML / CSS
UNIX文件名称有什么规定
2013/03/25 面试题
单位介绍信范文
2014/01/18 职场文书
优良学风班申请材料
2014/02/13 职场文书
《油菜花开了》教学反思
2014/02/22 职场文书
爱情寄语大全
2014/04/09 职场文书
某某同志考察材料
2014/05/28 职场文书
应届毕业生的自我评价
2019/06/21 职场文书
Mysql 设置boolean类型的操作
2021/06/04 MySQL
Python办公自动化之教你如何用Python将任意文件转为PDF格式
2021/06/28 Python
python数字类型和占位符详情
2022/03/13 Python