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 相关文章推荐
为什么在foreach循环中JAVA集合不能添加或删除元素
Jun 11 Java/Android
Java用自带的Image IO给图片添加水印
Jun 15 Java/Android
Java数组与堆栈相关知识总结
Jun 29 Java/Android
logback如何自定义日志存储
Aug 30 Java/Android
springboot中rabbitmq实现消息可靠性机制详解
Sep 25 Java/Android
使用jpa之动态插入与修改(重写save)
Nov 23 Java/Android
alibaba seata服务端具体实现
Feb 24 Java/Android
java如何实现获取客户端ip地址的示例代码
Apr 07 Java/Android
Spring Boot配合PageHelper优化大表查询数据分页
Apr 20 Java/Android
java实现自定义时钟并实现走时功能
Jun 21 Java/Android
springboot+rabbitmq实现智能家居实例详解
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
一个从别的网站抓取信息的例子(域名查询)
2006/10/09 PHP
使用swoole扩展php websocket示例
2014/02/13 PHP
CodeIgniter框架过滤HTML危险代码
2014/06/12 PHP
php+ajax实现图片文件上传功能实例
2014/06/17 PHP
php抓取并保存网站图片的实现代码
2015/10/28 PHP
PHP调用存储过程返回值不一致问题的解决方法分析
2016/04/26 PHP
thinkPHP简单调用函数与类库的方法
2017/03/15 PHP
PHP中16个高危函数整理
2019/09/19 PHP
discuz论坛更换域名,详细文件修改步骤
2020/12/09 PHP
JS 中document.URL 和 windows.location.href 的区别
2009/11/11 Javascript
Raphael带文本标签可拖动的图形实现代码
2013/02/20 Javascript
jQuery实现类似滑动门切换效果的层切换
2013/09/23 Javascript
IE、FF浏览器下修改标签透明度
2014/01/28 Javascript
js实现文章文字大小字号功能完整实例
2014/11/01 Javascript
在JS方法中返回多个值的方法汇总
2015/05/20 Javascript
javascript实现控制的多级下拉菜单
2015/07/05 Javascript
AngularJS使用ngOption实现下拉列表的实例代码
2016/01/23 Javascript
BootStrap Table 分页后重新搜索问题的解决办法
2016/08/08 Javascript
基于JavaScript实现树形下拉框
2016/08/10 Javascript
bootstrap table实现双击可编辑、添加、删除行功能
2017/09/27 Javascript
JS运动特效之完美运动框架实例分析
2018/01/24 Javascript
layui输入框只允许输入中文且判断长度的例子
2019/09/18 Javascript
Vue 解决路由过渡动画抖动问题(实例详解)
2020/01/05 Javascript
python的绘图工具matplotlib使用实例
2014/07/03 Python
TensorFlow用expand_dim()来增加维度的方法
2018/07/26 Python
PageFactory设计模式基于python实现
2020/04/14 Python
使用python处理题库表格并转化为word形式的实现
2020/04/14 Python
Django中的模型类设计及展示示例详解
2020/05/29 Python
Python脚本破解压缩文件口令实例教程(zipfile)
2020/06/14 Python
Python 实现二叉查找树的示例代码
2020/12/21 Python
印度排名第一的蛋糕、鲜花和礼品送货:Winni
2019/08/02 全球购物
《三顾茅庐》教学反思
2014/04/10 职场文书
2015年消防工作总结
2015/04/24 职场文书
2016年春节问候语
2015/11/11 职场文书
如何制作自己的原生JavaScript路由
2021/05/05 Javascript
flex布局中使用flex-wrap实现换行的项目实践
2022/06/21 HTML / CSS