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中Collection的一些常用方法总结
Jun 13 Java/Android
Java SSH 秘钥连接mysql数据库的方法
Jun 28 Java/Android
详解JAVA的控制语句
Nov 11 Java/Android
Android自定义scrollview实现回弹效果
Apr 01 Java/Android
Android Flutter实现3D动画效果示例详解
Apr 07 Java/Android
java如何实现获取客户端ip地址的示例代码
Apr 07 Java/Android
零基础学java之循环语句的使用
Apr 10 Java/Android
解决springboot druid数据库连接失败后一直重连的方法
Apr 19 Java/Android
Spring Boot项目如何优雅实现Excel导入与导出功能
Jun 10 Java/Android
Java完整实现记事本代码
Jun 16 Java/Android
Java+swing实现抖音上的表白程序详解
Jun 25 Java/Android
Spring Boot优化后启动速度快到飞起技巧示例
Jul 23 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
PHP跳转页面的几种实现方法详解
2013/06/08 PHP
使用PHP导出Redis数据到另一个Redis中的代码
2014/03/12 PHP
php静态文件生成类实例分析
2015/01/03 PHP
php通过修改header强制图片下载的方法
2015/03/24 PHP
PHP数组去重的更快实现方式分析
2018/05/09 PHP
PHP数组实际占用内存大小原理解析
2020/12/11 PHP
巧妙破除网页右键禁用的十大绝招
2006/08/12 Javascript
EasyUI中的tree用法介绍
2011/11/01 Javascript
基于jquery库的tab新形式使用
2012/11/16 Javascript
Javascript遍历Html Table示例(包括内容和属性值)
2014/07/08 Javascript
js的toUpperCase方法用法实例
2015/01/27 Javascript
基于jQuery实现多层次的手风琴效果附源码
2015/09/21 Javascript
简单的渐变轮播插件
2017/01/12 Javascript
基于Vue2.0+ElementUI实现表格翻页功能
2017/10/23 Javascript
打通前后端构建一个Vue+Express的开发环境
2018/07/17 Javascript
Vue如何实现变量表达式选择器
2021/02/18 Vue.js
[05:46]DOTA2英雄梦之声_第18期_陈
2014/06/20 DOTA
python中的内置函数getattr()介绍及示例
2014/07/20 Python
Python中矩阵创建和矩阵运算方法
2018/08/04 Python
python3.6使用pickle序列化class的方法
2018/10/22 Python
Python 隐藏输入密码时屏幕回显的实例
2019/02/19 Python
导入tensorflow时报错:cannot import name 'abs'的解决
2019/10/10 Python
python异常处理try except过程解析
2020/02/03 Python
python3中使用__slots__限定实例属性操作分析
2020/02/14 Python
Python将二维列表list的数据输出(TXT,Excel)
2020/04/23 Python
浅谈Python3中print函数的换行
2020/08/05 Python
Python selenium环境搭建实现过程解析
2020/09/08 Python
Python爬虫入门教程01之爬取豆瓣Top电影
2021/01/24 Python
基本款天堂:Everlane
2017/05/13 全球购物
JBL美国官方商店:扬声器、耳机等
2019/12/01 全球购物
PHP面试题集
2016/12/18 面试题
《桃林那间小木屋》教学反思
2014/05/01 职场文书
合伙经营协议书范本
2014/09/13 职场文书
教师党员承诺书2015
2015/01/21 职场文书
员工开除通知书
2015/04/25 职场文书
Java循环队列与非循环队列的区别总结
2021/06/22 Java/Android