美文网首页mybatis
MyBatis四大核心对象之ParameterHandler

MyBatis四大核心对象之ParameterHandler

作者: 施智沂 | 来源:发表于2020-04-06 11:48 被阅读0次

    ParameterHandler 是MyBatis四大核心对象之一,ParameterHandler 相比于其他的组件就简单很多了,ParameterHandler 译为参数处理器,负责为 PreparedStatement 的 sql 语句参数动态赋值,这个接口很简单只有两个方法:

    public interface ParameterHandler {
      // 用于读取参数;
      Object getParameterObject();
      // 用于对 PreparedStatement 绑定实参。
      void setParameters(PreparedStatement ps)
          throws SQLException;
    }
    

    MyBatis为ParameterHandler 只提供了一个实现类,也就是后面要详细介绍的DefaultParameterHandler。
    下面先介绍下ParameterHandler 的创建过程和相关执行流程:

    1.ParameterHandler 的创建过程

    2.ParameterHandler 的执行过程

    下面首先用流程图表示一下 ParameterHandler 的执行过程,以SimpleExecutor为例 相关代码:

    3.DefaultParameterHandler

    DefaultParameterHandler的核心字段含义如下

    DefaultParameterHandler的核心方法是setParameters()方法,改方法主要负责调用PreparedStatment的set*()方法为SQL语句绑定实参:

    public void setParameters(PreparedStatement ps) {
        ErrorContext.instance().activity("setting parameters").object(mappedStatement.getParameterMap().getId());
        // 从boundSql中获取sql语句的参数映射列表, parameterMappings 就是对 #{} 或者 ${} 里面参数的封装
        List<ParameterMapping> parameterMappings = boundSql.getParameterMappings();
        // 遍历这个参数列表,把参数设置到PreparedStatement中
        if (parameterMappings != null) {
          for (int i = 0; i < parameterMappings.size(); i++) {
            ParameterMapping parameterMapping = parameterMappings.get(i);
            // 对于存储过程中的参数不处理
            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;// 实参可以直接通过TypeHandler转换为JdbcType
              } else {
              // 获取对象中相应的属性或查找Map对象中的值
                MetaObject metaObject = configuration.newMetaObject(parameterObject);
                value = metaObject.getValue(propertyName);
              }
              // 从parameterMapping中获取typeHandler对象
              TypeHandler typeHandler = parameterMapping.getTypeHandler();
              //从从parameterMapping获取参数对应的jdbcType
              JdbcType jdbcType = parameterMapping.getJdbcType();
              if (value == null && jdbcType == null) {
                jdbcType = configuration.getJdbcTypeForNull();
              }
              try {
                // 通过TypeHandler.setParameter方法会调用PreparedStaement.set*()方法
                // 为SQL语句绑定相应实参
                typeHandler.setParameter(ps, i + 1, value, jdbcType);
              } catch (TypeException e) {
                throw new TypeException("Could not set parameters for mapping: " + parameterMapping + ". Cause: " + e, e);
              } catch (SQLException e) {
                throw new TypeException("Could not set parameters for mapping: " + parameterMapping + ". Cause: " + e, e);
              }
            }
          }
        }
      }
    

    相关文章

      网友评论

        本文标题:MyBatis四大核心对象之ParameterHandler

        本文链接:https://www.haomeiwen.com/subject/audvphtx.html