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 相关文章推荐
JPA如何使用entityManager执行SQL并指定返回类型
Jun 15 Java/Android
JVM入门之类加载与字节码技术(类加载与类的加载器)
Jun 15 Java/Android
Feign调用传输文件异常的解决
Jun 24 Java/Android
分析JVM源码之Thread.interrupt系统级别线程打断
Jun 29 Java/Android
java解析XML详解
Jul 09 Java/Android
关于maven依赖 ${xxx.version}报错问题
Jan 18 Java/Android
JavaCV实现照片马赛克效果
Jan 22 Java/Android
JVM之方法返回地址详解
Feb 28 Java/Android
Spring事务管理下synchronized锁失效问题的解决方法
Mar 31 Java/Android
Java中Quartz高可用定时任务快速入门
Apr 03 Java/Android
SpringBoot深入分析讲解监听器模式下
Jul 15 Java/Android
Java Spring读取和存储详细操作
Aug 05 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
利用文件属性结合Session实现在线人数统计
2006/10/09 PHP
剖析 PHP 中的输出缓冲
2006/12/21 PHP
PHP实现CSV文件的导入和导出类
2015/03/24 PHP
解决yii2左侧菜单子级无法高亮问题的方法
2016/05/08 PHP
DOMAssitant最新版 DOMAssistant 2.5发布
2007/12/25 Javascript
JQUBar 基于JQUERY的柱状图插件
2010/11/23 Javascript
JQuery表格内容过滤的实现方法
2013/07/05 Javascript
javascript回车完美实现tab切换功能
2014/03/13 Javascript
特殊情况下如何获取span里面的值
2014/05/20 Javascript
自编jQuery插件实现模拟alert和confirm
2014/09/01 Javascript
ECMAScript5中的对象存取器属性:getter和setter介绍
2014/12/08 Javascript
使用javascript实现判断当前浏览器
2015/04/14 Javascript
Jquery 自定义事件实现发布/订阅的简单实例
2016/06/12 Javascript
javascript 使用正则test( )第一次是 true,第二次是false
2017/02/22 Javascript
jQuery插件FusionCharts实现的MSBar3D图效果示例【附demo源码】
2017/03/23 jQuery
vue实现简单loading进度条
2018/06/06 Javascript
使用iView Upload 组件实现手动上传图片的示例代码
2018/10/01 Javascript
使用Bootstrap做一个朝代历史表
2019/12/10 Javascript
浅谈Vuex的this.$store.commit和在Vue项目中引用公共方法
2020/07/24 Javascript
python列表与元组详解实例
2013/11/01 Python
python使用PyGame播放Midi和Mp3文件的方法
2015/04/24 Python
python网络编程之文件下载实例分析
2015/05/20 Python
Numpy数组转置的两种实现方法
2018/04/17 Python
Python类装饰器实现方法详解
2018/12/21 Python
12个步骤教你理解Python装饰器
2019/07/01 Python
python爬虫的一个常见简单js反爬详解
2019/07/09 Python
Python中拆分字符串的操作方法
2019/07/23 Python
PyCharm下载和安装详细步骤
2019/12/17 Python
TripAdvisor斯洛伐克:阅读评论、比较价格和酒店预订
2018/04/25 全球购物
施华洛世奇中国官网:SWAROVSKI中国
2020/06/16 全球购物
幼儿园老师新年寄语2015
2014/12/08 职场文书
物业前台接待岗位职责
2015/04/03 职场文书
信用卡工资证明范本
2015/06/19 职场文书
校园安全主题班会
2015/08/12 职场文书
nginx部署多前端项目的几种方法
2021/05/25 Servers
Python中np.random.randint()参数详解及用法实例
2022/09/23 Python