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 相关文章推荐
springboot中一些比较常用的注解总结
Jun 11 Java/Android
分析Netty直接内存原理及应用
Jun 14 Java/Android
分析并发编程之LongAdder原理
Jun 29 Java/Android
java基础——多线程
Jul 03 Java/Android
Spring实现内置监听器
Jul 09 Java/Android
Java比较两个对象中全部属性值是否相等的方法
Aug 07 Java/Android
Java生成日期时间存入Mysql数据库的实现方法
Mar 03 Java/Android
Android自定义ScrollView实现阻尼回弹
Apr 01 Java/Android
Java工作中实用的代码优化技巧分享
Apr 21 Java/Android
Android 界面一键变灰 深色主题工具类
Apr 28 Java/Android
java版 联机五子棋游戏
May 04 Java/Android
Android Studio实现带三角函数对数运算功能的高级计算器
May 20 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
apache php模块整合操作指南
2012/11/16 PHP
php结合正则批量抓取网页中邮箱地址
2015/05/19 PHP
PHP和MySql中32位和64位的整形范围是多少
2016/02/18 PHP
PHP 信号管理知识整理汇总
2017/02/19 PHP
laravel框架中路由设置,路由参数和路由命名实例分析
2019/11/23 PHP
JAVASCRIPT  THIS详解 面向对象
2009/03/25 Javascript
Jjcarousellite 实现图片列表滚动的简单实例
2013/11/29 Javascript
jQuery写fadeTo示例代码
2014/02/21 Javascript
javascript文本框内输入文字倒计数的方法
2015/02/24 Javascript
JQ中$(window).load和$(document).ready区别与执行顺序
2017/03/01 Javascript
vue-cli构建项目使用 less的方法
2017/10/04 Javascript
基于js原生和ajax的get和post方法以及jsonp的原生写法实例
2017/10/16 Javascript
vue iview实现动态路由和权限验证功能
2018/04/17 Javascript
vue element table 表格请求后台排序的方法
2018/09/28 Javascript
在vue中使用setInterval的方法示例
2019/04/16 Javascript
微信小程序扫描二维码获取信息实例详解
2019/05/07 Javascript
微信小程序实现文件、图片上传功能
2020/08/18 Javascript
layui+SSM的数据表的增删改实例(利用弹框添加、修改)
2019/09/27 Javascript
vue实现瀑布流组件滑动加载更多
2020/03/10 Javascript
在Python中使用sort()方法进行排序的简单教程
2015/05/21 Python
12步入门Python中的decorator装饰器使用方法
2016/06/20 Python
python 打印出所有的对象/模块的属性(实例代码)
2016/09/11 Python
Python内建函数之raw_input()与input()代码解析
2017/10/26 Python
Python玩转Excel的读写改实例
2019/02/22 Python
详解爬虫被封的问题
2019/04/23 Python
使用python来调用CAN通讯的DLL实现方法
2019/07/03 Python
解决CSS3 transition-delay 属性默认值0不带单位失效的问题
2020/10/29 HTML / CSS
Microsoft Advertising美国:微软搜索广告
2019/05/01 全球购物
美团网旗下网上订餐平台:美团外卖
2020/03/05 全球购物
党支部换届选举方案
2014/05/08 职场文书
综合测评个人总结
2015/03/03 职场文书
个人年终总结结尾
2015/03/06 职场文书
党支部综合考察意见
2015/06/01 职场文书
python实现网络五子棋
2021/04/11 Python
HTML实现仿Windows桌面主题特效的实现
2022/06/28 HTML / CSS
基于Python实现西西成语接龙小助手
2022/08/05 Golang