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 相关文章推荐
Spring Data JPA的Audit功能审计数据库的变更
Jun 26 Java/Android
浅谈自定义校验注解ConstraintValidator
Jun 30 Java/Android
Java使用jmeter进行压力测试
Jul 09 Java/Android
浅谈spring boot使用thymeleaf版本的问题
Aug 04 Java/Android
Netty分布式客户端接入流程初始化源码分析
Mar 25 Java/Android
Elasticsearch Recovery 详细介绍
Apr 19 Java/Android
Qt数据库应用之实现图片转pdf
Jun 01 Java/Android
Android中的Launch Mode详情
Jun 05 Java/Android
Spring Boot项目如何优雅实现Excel导入与导出功能
Jun 10 Java/Android
Java Spring Boot请求方式与请求映射过程分析
Jun 25 Java/Android
springboot+rabbitmq实现智能家居实例详解
Jul 23 Java/Android
Springboot集成kafka高级应用实战分享
Aug 14 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
CodeIgniter常用知识点小结
2016/05/26 PHP
php Session无效分析资料整理
2016/11/29 PHP
详解PHP中mb_strpos的使用
2018/02/04 PHP
php微信公众号开发之现金红包
2018/04/16 PHP
js报错 Object doesn't support this property or method的原因分析
2011/03/31 Javascript
jQuery拖动div、移动div、弹出层实现原理及示例
2014/04/08 Javascript
JS比较2个日期间隔的示例代码
2014/04/15 Javascript
jquery+ajax实现跨域请求的方法
2015/01/20 Javascript
原生JS封装ajax 传json,str,excel文件上传提交表单(推荐)
2016/06/21 Javascript
Bootstrap基本插件学习笔记之Popover提示框(19)
2016/12/08 Javascript
JavaScript模块详解
2017/12/18 Javascript
微信小程序在线客服自动回复功能(基于node)
2019/07/03 Javascript
vue点击页面空白处实现保存功能
2019/11/06 Javascript
Python获取某一天是星期几的方法示例
2017/01/17 Python
Python实用技巧之列表、字典、集合中根据条件筛选数据详解
2018/07/11 Python
python二维码操作:对QRCode和MyQR入门详解
2019/06/24 Python
python使用mitmproxy抓取浏览器请求的方法
2019/07/02 Python
基于pytorch的保存和加载模型参数的方法
2019/08/17 Python
python实现猜拳小游戏
2020/04/05 Python
在python中利用try..except来代替if..else的用法
2019/12/19 Python
Python实现查找数据库最接近的数据
2020/06/08 Python
pip已经安装好第三方库但pycharm中import时还是标红的解决方案
2020/10/09 Python
Kent & Curwen:与大卫·贝克汉姆合作
2017/06/13 全球购物
加拿大领先的优质厨具产品在线购物网站:Golda’s Kitchen
2017/11/17 全球购物
在校硕士自我鉴定
2014/01/23 职场文书
保护地球的标语
2014/06/17 职场文书
个人三严三实对照检查材料思想汇报
2014/09/22 职场文书
优秀党员事迹材料
2014/12/18 职场文书
担保书范本
2015/01/20 职场文书
2015年学生会工作总结范文
2015/03/31 职场文书
六一晚会主持词开场白
2015/05/28 职场文书
个人催款函范文
2015/06/24 职场文书
运动会班级前导词
2015/07/20 职场文书
预防职务犯罪警示教育心得体会
2016/01/15 职场文书
学生会自荐信
2019/05/16 职场文书
导游词之吉林吉塔
2019/11/11 职场文书