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 相关文章推荐
浅谈Java实现分布式事务的三种方案
Jun 11 Java/Android
JVM入门之类加载与字节码技术(类加载与类的加载器)
Jun 15 Java/Android
Java数据结构之链表相关知识总结
Jun 18 Java/Android
Java中使用Filter过滤器的方法
Jun 28 Java/Android
解决MultipartFile.transferTo(dest) 报FileNotFoundExcep的问题
Jul 01 Java/Android
Java后台生成图片的完整步骤
Aug 04 Java/Android
Logback 使用TurboFilter实现日志级别等内容的动态修改操作
Aug 30 Java/Android
聊聊Lombok中的@Builder注解使用教程
Nov 17 Java/Android
springboot layui hutool Excel导入的实现
Mar 31 Java/Android
Java实战之课程信息管理系统的实现
Apr 01 Java/Android
Android存储中最基本的文件存储方式
Apr 30 Java/Android
利用正则表达式匹配浮点型数据
May 30 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程序员编程注意事项
2008/04/10 PHP
PHP身份证校验码计算方法
2016/08/10 PHP
控制打印时页眉角的代码
2007/02/08 Javascript
Riot.js 快速的JavaScript单元测试框架
2009/11/09 Javascript
为jquery.ui.dialog 增加“在当前鼠标位置打开”的功能
2009/11/24 Javascript
javascript学习笔记(八) js内置对象
2012/06/19 Javascript
jquery 添加节点的几种方法介绍
2013/09/04 Javascript
javascript ajax 仿百度分页函数
2013/10/29 Javascript
解析JavaScript中点号“.”的多义性
2013/12/02 Javascript
CSS3实现动态背景登录框的代码
2015/07/28 Javascript
jQuery事件绑定用法详解(附bind和live的区别)
2016/01/19 Javascript
jQuery点击输入框显示验证码图片
2016/05/19 Javascript
JavaScript探测CSS动画是否已经完成的方法
2016/08/30 Javascript
node+experss实现爬取电影天堂爬虫
2016/11/20 Javascript
js的OOP继承实现(必看篇)
2017/02/18 Javascript
实例讲解javascript实现异步图片上传方法
2017/12/05 Javascript
Vue.js实现图片的随意拖动方法
2018/03/08 Javascript
VScode格式化ESlint方法(最全最好用方法)
2019/09/10 Javascript
vue实现鼠标经过动画
2019/10/16 Javascript
原生JavaScript实现滑动拖动验证的示例代码
2019/12/06 Javascript
[01:25]DOTA2自定义游戏灵园鬼域等你踏足
2015/10/30 DOTA
Python中asyncore异步模块的用法及实现httpclient的实例
2016/06/28 Python
TensorFlow 模型载入方法汇总(小结)
2018/06/19 Python
浅谈Scrapy网络爬虫框架的工作原理和数据采集
2019/02/07 Python
Python参数传递及收集机制原理解析
2020/06/05 Python
HTML5新控件之日期和时间选择输入的实现代码
2018/09/13 HTML / CSS
HTML5实现应用程序缓存(Application Cache)
2020/06/16 HTML / CSS
全球知名提供各类营养保健品的零售商:Vitamin Shoppe
2016/10/09 全球购物
英国独特礼物想法和个性化礼物网站:notonthehighstreet.com
2018/04/16 全球购物
医务人员竞聘职务自我评价分享
2013/11/08 职场文书
活动总结的格式
2014/05/07 职场文书
优秀乡村医生先进事迹材料
2014/08/23 职场文书
教师作风整改措施思想汇报
2014/10/12 职场文书
八达岭长城导游词
2015/01/30 职场文书
2015年社区卫生工作总结
2015/04/21 职场文书
如何写好开幕词?
2019/06/24 职场文书