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 Optional<Foo>转换成List<Bar>的实例方法
Jun 20 Java/Android
Java 中的 Unsafe 魔法类的作用大全
Jun 26 Java/Android
浅谈Java父子类加载顺序
Aug 04 Java/Android
maven依赖的version声明控制方式
Jan 18 Java/Android
RestTemplate如何通过HTTP Basic Auth认证示例说明
Mar 17 Java/Android
Java 常见的限流算法详细分析并实现
Apr 07 Java/Android
Android开发之WECHAT微信小程序路由跳转的两种形式
Apr 12 Java/Android
Java后端 Dubbo retries 超时重试机制的解决方案
Apr 14 Java/Android
Android studio 简单计算器的编写
May 20 Java/Android
Java实现扫雷游戏详细代码讲解
May 25 Java/Android
详解Spring Security如何在权限中使用通配符
Jun 28 Java/Android
基于Android10渲染Surface的创建过程
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
php对称加密算法示例
2014/05/07 PHP
php+ajax实现图片文件上传功能实例
2014/06/17 PHP
Parse正式发布开源PHP SDK
2014/08/11 PHP
PHP文件读取功能的应用实例
2015/05/08 PHP
php调用淘宝开放API实现根据卖家昵称获取卖家店铺ID的方法
2015/07/29 PHP
PHP直接修改表内容DataGrid功能实现代码
2015/09/24 PHP
Zend Framework缓存Cache用法简单实例
2016/03/19 PHP
PHP实现的贪婪算法实例
2017/10/17 PHP
javascript SocialHistory 检查访问者是否访问过某站点
2008/08/02 Javascript
鼠标放在图片上显示大图的JS代码
2013/03/26 Javascript
JS实现判断碰撞的方法
2015/02/11 Javascript
js事件处理程序跨浏览器解决方案
2016/03/27 Javascript
jQuery ajaxSubmit 实现ajax提交表单局部刷新
2016/07/04 Javascript
JS HTML5拖拽上传图片预览
2016/07/18 Javascript
Jquery删除css属性的简单方法
2016/12/04 Javascript
详解Vue.js之视图和数据的双向绑定(v-model)
2017/06/23 Javascript
详解从react转职到vue开发的项目准备
2019/01/14 Javascript
Layui数据表格 前后端json数据接收的方法
2019/09/19 Javascript
Python中表达式x += y和x = x+y 的区别详解
2017/06/20 Python
恢复百度云盘本地误删的文件脚本(简单方法)
2017/10/21 Python
python 将字符串转换成字典dict的各种方式总结
2018/03/23 Python
python获取本机所有IP地址的方法
2018/12/26 Python
Python tkinter和exe打包的方法
2020/02/05 Python
Django框架安装及项目创建过程解析
2020/09/14 Python
Python ConfigParser模块的使用示例
2020/10/12 Python
北承题目(C++)
2012/05/16 面试题
你对IPv6了解程度
2016/02/09 面试题
平民服装店创业计划书
2014/01/17 职场文书
cf战队收人广告词
2014/03/14 职场文书
健康家庭事迹材料
2014/05/02 职场文书
五四青年节比赛演讲稿
2015/03/18 职场文书
2015年工程师工作总结
2015/04/30 职场文书
生产设备维护保养制度
2015/08/06 职场文书
Python趣味挑战之给幼儿园弟弟生成1000道算术题
2021/05/28 Python
梳理总结Python开发中需要摒弃的18个坏习惯
2022/01/22 Python
SQL Server中T-SQL标识符介绍与无排序生成序号的方法
2022/05/25 SQL Server