java executor包参数处理功能 


Posted in Java/Android onFebruary 15, 2022

sql语句中的参数赋值是有由executor包中的parameter子包完成的。

parameter子包其实只有一个parameterHandler接口,它定义了2个方法:

public interface ParameterHandler {

  Object getParameterObject();

  void setParameters(PreparedStatement ps)
      throws SQLException;

}

ParameterHandler接口有一个默认的实现类DefaultParameterHandler,它在scripting包的子包中。

mybatis中支持进行参数设置的语句类型是PreparedStatement接口及其子接口CallableStatement, 所以setParameters的输入参数是PreparedStatement类型。

setParameters方法的实现逻辑就是依次取出每个参数的值,然后根据参数类型调用PreparedStatement中的赋值方法进行赋值。

public class DefaultParameterHandler implements ParameterHandler {
  // 类型处理器注册表
  private final TypeHandlerRegistry typeHandlerRegistry;
  // MappedStatement对象(包含完整的增删改查节点信息)
  private final MappedStatement mappedStatement;
  // 参数对象
  private final Object parameterObject;
  // BoundSql对象(包含SQL语句、参数、实参信息)
  private final BoundSql boundSql;
  // 配置信息
  private final Configuration configuration;

  public DefaultParameterHandler(MappedStatement mappedStatement, Object parameterObject, BoundSql boundSql) {
    this.mappedStatement = mappedStatement;
    this.configuration = mappedStatement.getConfiguration();
    this.typeHandlerRegistry = mappedStatement.getConfiguration().getTypeHandlerRegistry();
    this.parameterObject = parameterObject;
    this.boundSql = boundSql;
  }

  @Override
  public Object getParameterObject() {
    return parameterObject;
  }

  /**
   * 为语句设置参数
   * @param ps 语句
   */
  @Override
  public void setParameters(PreparedStatement ps) {
    ErrorContext.instance().activity("setting parameters").object(mappedStatement.getParameterMap().getId());
    // 取出参数列表
    List<ParameterMapping> parameterMappings = boundSql.getParameterMappings();
    if (parameterMappings != null) {
      for (int i = 0; i < parameterMappings.size(); i++) {
        ParameterMapping parameterMapping = parameterMappings.get(i);
        // ParameterMode.OUT是CallableStatement的输出参数,已经单独注册。故忽略
        if (parameterMapping.getMode() != ParameterMode.OUT) {
          Object value;
          // 取出属性名称
          String propertyName = parameterMapping.getProperty();
          if (boundSql.hasAdditionalParameter(propertyName)) {
            // 从附加参数中读取属性值
            value = boundSql.getAdditionalParameter(propertyName);
          } else if (parameterObject == null) {
            value = null;
          } else if (typeHandlerRegistry.hasTypeHandler(parameterObject.getClass())) {
            // 参数对象是基本类型,则参数对象即为参数值
            value = parameterObject;
          } else {
            // 参数对象是复杂类型,取出参数对象的该属性值
            MetaObject metaObject = configuration.newMetaObject(parameterObject);
            value = metaObject.getValue(propertyName);
          }
          // 确定该参数的处理器
          TypeHandler typeHandler = parameterMapping.getTypeHandler();
          JdbcType jdbcType = parameterMapping.getJdbcType();
          if (value == null && jdbcType == null) {
            jdbcType = configuration.getJdbcTypeForNull();
          }
          try {
            // 此方法最终根据参数类型,调用java.sql.PreparedStatement类中的参数赋值方法,对SQL语句中的参数赋值
            typeHandler.setParameter(ps, i + 1, value, jdbcType);
          } catch (TypeException | SQLException e) {
            throw new TypeException("Could not set parameters for mapping: " + parameterMapping + ". Cause: " + e, e);
          }
        }
      }
    }
  }

}

到此这篇关于java executor包参数处理功能 的文章就介绍到这了,更多相关executor包参数处理功能 内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Java/Android 相关文章推荐
图解排序算法之希尔排序Java实现
Jun 26 Java/Android
Java基础之线程锁相关知识总结
Jun 30 Java/Android
SpringBoot工程下使用OpenFeign的坑及解决
Jul 02 Java/Android
使用@Value值注入及配置文件组件扫描
Jul 09 Java/Android
详细了解java监听器和过滤器
Jul 09 Java/Android
解析探秘fescar分布式事务实现原理
Feb 28 Java/Android
SpringBoot整合minio快速入门教程(代码示例)
Apr 03 Java/Android
mapstruct的用法之qualifiedByName示例详解
Apr 06 Java/Android
java中为什么说子类的构造方法默认访问的是父类的无参构造方法
Apr 13 Java/Android
Java 使用类型为Object的变量指向任意类型的对象
Apr 13 Java/Android
引用计数法和root搜索算法以及JVM中判定对象需要回收的方法
Apr 19 Java/Android
利用Java连接Hadoop进行编程
Jun 28 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
maven依赖的version声明控制方式
You might like
smarty section简介与用法分析
2008/10/03 PHP
php数据类型判断函数有哪些
2013/09/23 PHP
Yii2框架实现数据库常用操作总结
2017/02/08 PHP
Laravel中encrypt和decrypt的实现方法
2017/09/24 PHP
详解Laravel服务容器的绑定与解析
2019/11/05 PHP
在模板页面的js使用办法
2010/04/01 Javascript
javascript 内存回收机制理解
2011/01/17 Javascript
eval与window.eval的差别分析
2011/03/17 Javascript
js写一个弹出层并锁屏效果实现代码
2012/12/07 Javascript
Javasipt:操作radio标签详解
2013/12/30 Javascript
JS组件中bootstrap multiselect两大组件较量
2016/01/26 Javascript
Bootstrap表单布局样式代码
2016/05/31 Javascript
简单谈谈ES6的六个小特性
2016/11/18 Javascript
jquery对所有input type=text的控件赋值实现方法
2016/12/02 Javascript
利用jQuery插件imgAreaSelect实现获得选择域的图像信息
2016/12/02 Javascript
浅谈Node.js:Buffer模块
2016/12/05 Javascript
Bootstrap基本模板的使用和理解1
2016/12/14 Javascript
Webpack 之 babel-loader文件预处理器详解
2018/03/23 Javascript
python getopt 参数处理小示例
2009/06/09 Python
Python实现的字典值比较功能示例
2018/01/08 Python
Python cookbook(数据结构与算法)同时对数据做转换和换算处理操作示例
2018/03/23 Python
基于Python3.6+splinter实现自动抢火车票
2018/09/25 Python
python 二维矩阵转三维矩阵示例
2019/11/30 Python
Python求两个字符串最长公共子序列代码实例
2020/03/05 Python
python删除指定列或多列单个或多个内容实例
2020/06/28 Python
pycharm中leetcode插件使用图文详解
2020/12/07 Python
外语系毕业生找工作的求职信
2013/11/28 职场文书
《美丽的公鸡》教学反思
2014/02/25 职场文书
《三峡》教学反思
2014/03/01 职场文书
文明市民先进事迹
2014/05/15 职场文书
食品委托检验协议书范本
2014/09/12 职场文书
思想纪律作风整顿剖析材料
2014/10/11 职场文书
2015年人事科工作总结
2015/04/28 职场文书
2016年七夕爱情寄语
2015/12/04 职场文书
晶体管单管来复再生式收音机
2021/04/22 无线电
Win11局域网共享权限在哪里设置? Win11高级共享的设置技巧
2022/04/05 数码科技