美文网首页
带你学习Mybatis之ParameterHandler参数处理

带你学习Mybatis之ParameterHandler参数处理

作者: 墨线宝 | 来源:发表于2024-06-14 21:51 被阅读0次

ParameterHandler参数处理

ParameterHandler是参数处理器,mybatis通过ParameterHandler对预编译sql中参数进行设置,如果有配置typeHandler,自然会对注册的typeHandler对参数进行处理

public interface ParameterHandler {
  // 获取参数对象
    Object getParameterObject();
        // 负责调用PreparedStatement.set*方法为SQL绑定实参
    void setParameters(PreparedStatement var1) throws SQLException;
}

DefaultParameterHandler

mybatis只为ParameterHandler提供了一个唯一的实现类DefaultParameterHandler

public class DefaultParameterHandler implements ParameterHandler {
    // 管理mybatis中全部的TypeHandler对象
    private final TypeHandlerRegistry typeHandlerRegistry;
    // 记录SQL节点相应的配置信息
    private final MappedStatement mappedStatement;
    // 用户传入的实参对象
    private final Object parameterObject;
    // 记录对应参数的名称和相关属性
    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;
    }

    public Object getParameterObject() {
        return this.parameterObject;
    }

    public void setParameters(PreparedStatement ps) {
        ErrorContext.instance().activity("setting parameters").object(this.mappedStatement.getParameterMap().getId());
        // 取除sql中的参数列表
        List<ParameterMapping> parameterMappings = this.boundSql.getParameterMappings();
        if (parameterMappings != null) {
            for(int i = 0; i < parameterMappings.size(); ++i) {
              // 获取对应索引位的参数
                ParameterMapping parameterMapping = (ParameterMapping)parameterMappings.get(i);
                // 过滤存储过程的输出参数
                if (parameterMapping.getMode() != ParameterMode.OUT) {
                    // 获取参数名称
                    String propertyName = parameterMapping.getProperty();
                    Object value;
                    // 获取对应实参值
                    if (this.boundSql.hasAdditionalParameter(propertyName)) {
                        value = this.boundSql.getAdditionalParameter(propertyName);
                    } else if (this.parameterObject == null) {
                        value = null;
                    } else if (this.typeHandlerRegistry.hasTypeHandler(this.parameterObject.getClass())) {
                        value = this.parameterObject;
                    } else {
                        MetaObject metaObject = this.configuration.newMetaObject(this.parameterObject);
                        value = metaObject.getValue(propertyName);
                    }

                    TypeHandler typeHandler = parameterMapping.getTypeHandler();
                    JdbcType jdbcType = parameterMapping.getJdbcType();
                    if (value == null && jdbcType == null) {
                        jdbcType = this.configuration.getJdbcTypeForNull();
                    }

                    try {
                        // 该方法会调用PreparedStatement.set*方法为SQL语句绑定相应的实参
                        typeHandler.setParameter(ps, i + 1, value, jdbcType);
                    } catch (SQLException | TypeException var10) {
                        throw new TypeException("Could not set parameters for mapping: " + parameterMapping + ". Cause: " + var10, var10);
                    }
                }
            }
        }

    }
}

https://zhhll.icu/2020/框架/mybatis/组件分析/6.mybatis之ParameterHandler/

本文由mdnice多平台发布

相关文章

网友评论

      本文标题:带你学习Mybatis之ParameterHandler参数处理

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