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实现数据结构之并查集
Jun 23 Java/Android
Java基础之this关键字的使用
Jun 30 Java/Android
Java面试题冲刺第十九天--数据库(4)
Aug 07 Java/Android
JVM钩子函数的使用场景详解
Aug 23 Java/Android
Eclipse+Java+Swing+Mysql实现电影购票系统(详细代码)
Jan 18 Java/Android
Java 深入探究讲解简单工厂模式
Apr 07 Java/Android
java如何实现获取客户端ip地址的示例代码
Apr 07 Java/Android
SpringBoot 集成短信和邮件 以阿里云短信服务为例
Apr 22 Java/Android
springcloud整合seata
May 20 Java/Android
SpringBoot使用ip2region获取地理位置信息的方法
Jun 21 Java/Android
SpringBoot详解执行过程
Jul 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
maven依赖的version声明控制方式
You might like
php 3行代码的分页算法(求起始页和结束页)
2009/10/21 PHP
8个PHP数组面试题
2015/06/23 PHP
关于ThinkPhp 框架表单验证及ajax验证问题
2017/07/19 PHP
laravel开发环境homestead搭建过程详解
2020/07/03 PHP
THINKPHP5分页数据对象处理过程解析
2020/10/28 PHP
js获取元素在浏览器中的绝对位置
2010/07/24 Javascript
JS 添加网页桌面快捷方式的代码详细整理
2012/12/27 Javascript
js生成缩略图后上传并利用canvas重绘
2014/05/15 Javascript
绑定回车enter事件代码
2014/05/18 Javascript
jQuery实现行文字链接提示效果的方法
2015/03/10 Javascript
JS修改iframe页面背景颜色的方法
2015/04/01 Javascript
JavaScript让Textarea支持tab按键的方法
2015/06/26 Javascript
Augularjs-起步详解
2016/07/08 Javascript
Angular.js实现注册系统的实例详解
2016/12/18 Javascript
使用smartupload组件实现jsp+jdbc上传下载文件实例解析
2017/01/05 Javascript
bootstrap table配置参数例子
2017/01/05 Javascript
canvas时钟效果
2017/02/16 Javascript
新版小程序登录授权的方法
2018/12/12 Javascript
[31:01]2014 DOTA2国际邀请赛中国区预选赛5.21 CNB VS Orenda
2014/05/23 DOTA
Pycharm编辑器技巧之自动导入模块详解
2017/07/18 Python
Python之reload流程实例代码解析
2018/01/29 Python
基于python3 OpenCV3实现静态图片人脸识别
2018/05/25 Python
python实现向微信用户发送每日一句 python实现微信聊天机器人
2019/03/27 Python
pandas 数据索引与选取的实现方法
2019/06/21 Python
在 Jupyter 中重新导入特定的 Python 文件(场景分析)
2019/10/27 Python
python 实现批量替换文本中的某部分内容
2019/12/13 Python
python requests.get带header
2020/05/05 Python
Python爬虫获取豆瓣电影并写入excel
2020/07/31 Python
python实现图像高斯金字塔的示例代码
2020/12/11 Python
html5理解head_动力节点Java学院整理
2017/07/13 HTML / CSS
html5 Canvas画图教程(8)—canvas里画曲线之bezierCurveTo方法
2013/01/09 HTML / CSS
施工人员岗位职责
2013/12/12 职场文书
化学学院毕业生自荐信范文
2013/12/17 职场文书
校园安全主题班会
2015/08/12 职场文书
使用PDF.js渲染canvas实现预览pdf的效果示例
2021/04/17 Javascript
整理Python中常用的conda命令操作
2021/06/15 Python