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 相关文章推荐
SpringCloud Alibaba 基本开发框架搭建过程
Jun 13 Java/Android
详解JAVA中的OPTIONAL
Jun 14 Java/Android
Java实现二维数组和稀疏数组之间的转换
Jun 27 Java/Android
Spring中的使用@Async异步调用方法
Nov 01 Java/Android
深入解读Java三大集合之map list set的用法
Nov 11 Java/Android
springboot 多数据源配置不生效遇到的坑及解决
Nov 17 Java/Android
Java 在线考试云平台的实现
Nov 23 Java/Android
JVM的类加载器和双亲委派模式你了解吗
Mar 13 Java/Android
Mybatis-Plus进阶分页与乐观锁插件及通用枚举和多数据源详解
Mar 21 Java/Android
Spring Boot DevTools 全局配置学习指南
Mar 31 Java/Android
零基础学java之带返回值的方法的定义和调用
Apr 10 Java/Android
Android Studio实现带三角函数对数运算功能的高级计算器
May 20 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中ob_flush和flush的区别
2014/11/27 PHP
php可生成缩略图的文件上传类实例
2014/12/17 PHP
YII Framework框架教程之使用YIIC快速创建YII应用详解
2016/03/15 PHP
PHP面向对象学习之parent::关键字
2017/01/18 PHP
php 如何设置一个严格控制过期时间的session
2017/05/05 PHP
laravel框架模型、视图与控制器简单操作示例
2019/10/10 PHP
jquery validator 插件增加日期比较方法
2010/02/21 Javascript
入门基础学习 ExtJS笔记(一)
2010/11/11 Javascript
JavaScript实现多维数组的方法
2013/11/20 Javascript
javaScript 页面自动加载事件详解
2014/02/10 Javascript
js使用Array.prototype.sort()对数组对象排序的方法
2015/01/28 Javascript
最简单的JavaScript验证整数、小数、实数、有效位小数正则表达式
2015/04/17 Javascript
最精简的JavaScript实现鼠标拖动效果的方法
2015/05/11 Javascript
AngularJS模块详解及示例代码
2016/08/17 Javascript
JavaScript函数绑定用法实例分析
2017/11/14 Javascript
详解VueJS应用中管理用户权限
2018/02/02 Javascript
angularjs 缓存的使用详解
2018/03/19 Javascript
详解微信小程序胶囊按钮返回|首页自定义导航栏功能
2019/06/14 Javascript
查找Vue中下标的操作(some和findindex)
2020/08/12 Javascript
[02:54]DOTA2亚洲邀请赛 VG战队出场宣传片
2015/02/07 DOTA
详细解析Python中的变量的数据类型
2015/05/13 Python
使用简单工厂模式来进行Python的设计模式编程
2016/03/01 Python
深入浅析ImageMagick命令执行漏洞
2016/10/11 Python
Python设计模式之代理模式简单示例
2018/01/09 Python
朴素贝叶斯分类算法原理与Python实现与使用方法案例
2018/06/26 Python
Flask框架响应、调度方法和蓝图操作实例分析
2018/07/24 Python
Python学习笔记之集合的概念和简单使用示例
2019/08/22 Python
Python 中的 import 机制之实现远程导入模块
2019/10/29 Python
pytorch nn.Conv2d()中的padding以及输出大小方式
2020/01/10 Python
Python对excel的基本操作方法
2021/02/18 Python
市场专员岗位职责
2014/02/14 职场文书
交警个人先进事迹材料
2014/05/11 职场文书
贵阳市党的群众路线教育实践活动党(工)委领导班子整改方案
2014/10/26 职场文书
南湾猴岛导游词
2015/02/09 职场文书
导游词之桂林山水
2019/09/20 职场文书
第四次工业革命,打工人与机器人的竞争
2022/04/21 数码科技