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 将PPT幻灯片转为HTML文件的实现思路
Jun 11 Java/Android
springboot中rabbitmq实现消息可靠性机制详解
Sep 25 Java/Android
JAVA API 实用类 String详解
Oct 05 Java/Android
Java使用JMeter进行高并发测试
Nov 23 Java/Android
springmvc直接不经过controller访问WEB-INF中的页面问题
Feb 24 Java/Android
Spring Bean是如何初始化的详解
Mar 22 Java/Android
java后台调用接口及处理跨域问题的解决
Mar 24 Java/Android
Java中生成微信小程序太阳码的实现方案
Jun 01 Java/Android
Android 中的类文件和类加载器详情
Jun 05 Java/Android
向Spring IOC 容器动态注册bean实现方式
Jul 15 Java/Android
java获取一个文本文件的编码(格式)信息
Sep 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
PHP中usort在值相同时改变原始位置问题的解决方法
2011/11/27 PHP
Laravel 不同生产环境服务器的判断实践
2019/10/15 PHP
Javascript学习笔记9 prototype封装继承
2010/01/11 Javascript
Ext.get() 和 Ext.query()组合使用实现最灵活的取元素方式
2011/09/26 Javascript
jQuery解析XML与传统JavaScript方法的差别实例分析
2015/03/05 Javascript
AngularJS HTML DOM详解及示例代码
2016/08/17 Javascript
jQuery事件对象总结
2016/10/17 Javascript
基于javascript实现的快速排序
2016/12/02 Javascript
浅谈JavaScript中的apply/call/bind和this的使用
2017/02/26 Javascript
移动端刮刮乐的实现方式(js+HTML5)
2017/03/23 Javascript
jquery基于layui实现二级联动下拉选择(省份城市选择)
2017/06/20 jQuery
SeaJS中use函数用法实例分析
2017/10/10 Javascript
js实现随机点名系统(实例讲解)
2017/10/18 Javascript
vue动画效果实现方法示例
2019/03/18 Javascript
javascript原型链学习记录之继承实现方式分析
2019/05/01 Javascript
JS实现的对象去重功能示例
2019/06/04 Javascript
后台使用freeMarker和前端使用vue的方法及遇到的问题
2019/06/13 Javascript
JavaScript this使用方法图解
2020/02/04 Javascript
[01:14:12]2018DOTA2亚洲邀请赛4.7 总决赛 LGD vs Mineski 第二场
2018/04/09 DOTA
python提取页面内url列表的方法
2015/05/25 Python
详解Django框架中的视图级缓存
2015/07/23 Python
解决pyqt中ui编译成窗体.py中文乱码的问题
2016/12/23 Python
Python get获取页面cookie代码实例
2018/09/12 Python
Python编写带选项的命令行程序方法
2019/08/13 Python
Django限制API访问频率常用方法解析
2020/10/12 Python
pytorch 计算Parameter和FLOP的操作
2021/03/04 Python
网页中的电话号码如何实现一键直呼效果_附示例
2016/03/15 HTML / CSS
全世界最美丽的四星和五星级酒店预订:Prestigia.com
2017/11/15 全球购物
军训自我鉴定怎么写
2014/02/13 职场文书
经销商订货会主持词
2014/03/27 职场文书
雨花台导游词
2015/02/06 职场文书
义诊活动通知
2015/04/24 职场文书
2015年保卫科工作总结
2015/05/14 职场文书
朋友聚会祝酒词
2015/08/10 职场文书
新郎父母婚礼答谢词
2015/09/29 职场文书
全新239军机修复记
2022/04/05 无线电