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设置Word文本框中的文字旋转方向的实现方法
Jun 28 Java/Android
Java集成swagger文档组件
Jun 28 Java/Android
springboot集成springCloud中gateway时启动报错的解决
Jul 16 Java/Android
Java 实战项目之家居购物商城系统详解流程
Nov 11 Java/Android
你知道Java Spring的两种事务吗
Mar 16 Java/Android
Android超详细讲解组件ScrollView的使用
Mar 31 Java/Android
Java中Quartz高可用定时任务快速入门
Apr 03 Java/Android
引用计数法和root搜索算法以及JVM中判定对象需要回收的方法
Apr 19 Java/Android
Android开发 使用文件储存的方式保存QQ密码
Apr 24 Java/Android
Android中View.post和Handler.post的关系
Jun 05 Java/Android
Spring JPA 增加字段执行异常问题及解决
Jun 10 Java/Android
java实现web实时消息推送的七种方案
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
php empty,isset,is_null判断比较(差异与异同)
2010/10/19 PHP
php除数取整示例
2014/04/24 PHP
PHP使用CURL模拟登录的方法
2015/07/08 PHP
ThinkPHP3.2.2实现持久登录(记住我)功能的方法
2016/05/16 PHP
CI框架网页缓存简单用法分析
2018/12/26 PHP
PHP使用PDO创建MySQL数据库、表及插入多条数据操作示例
2019/05/30 PHP
Lazy Load 延迟加载图片的jQuery插件中文使用文档
2012/10/18 Javascript
jquery实现根据浏览器窗口大小自动缩放图片的方法
2015/07/17 Javascript
jQuery animate和CSS3相结合实现缓动追逐效果附源码下载
2016/04/18 Javascript
在vue中,v-for的索引index在html中的使用方法
2018/03/06 Javascript
详解Webstorm 下的Angular2.0开发之路(图文)
2018/12/06 Javascript
D3.js(v3)+react 实现带坐标与比例尺的柱形图 (V3版本)
2019/05/09 Javascript
浅析Python中return和finally共同挖的坑
2017/08/18 Python
python爬虫之BeautifulSoup 使用select方法详解
2017/10/23 Python
python先序遍历二叉树问题
2017/11/10 Python
Python实现的简单读写csv文件操作示例
2018/07/12 Python
python 多个参数不为空校验方法
2019/02/14 Python
对Python 检查文件名是否规范的实例详解
2019/06/10 Python
详解基于Scrapy的IP代理池搭建
2020/09/29 Python
python单例模式的应用场景实例讲解
2021/02/24 Python
CSS3简单实现照片墙
2014/12/12 HTML / CSS
美体小铺瑞典官方网站:The Body Shop瑞典
2018/01/27 全球购物
英国男士时尚网站:Dandy Fellow
2018/02/09 全球购物
荷兰电脑专场:Paradigit
2018/05/05 全球购物
澳大利亚运动鞋零售商:The Athlete’s Foot
2018/11/04 全球购物
英国护发和美妆在线商店:Klip Shop
2019/03/24 全球购物
波兰汽车配件网上商店:iParts.pl
2020/09/08 全球购物
Java的基础面试题附答案
2016/01/10 面试题
计算机相关的自我评价
2014/01/15 职场文书
中级会计职业生涯规划书
2014/03/01 职场文书
2014年道德讲堂实施方案
2014/03/05 职场文书
知识就是力量演讲稿
2014/09/13 职场文书
先进工作者申报材料
2014/12/23 职场文书
应届生个人的求职(自荐信范文2篇)
2019/08/23 职场文书
导游词之河北野三坡
2019/12/11 职场文书
浅谈哪个Python库才最适合做数据可视化
2021/06/28 Python