带你学习Mybatis之ParameterHandler参数处理

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 多平台发布

相关推荐

  1. 学习MybatisParameterHandler参数处理

    2024-06-16 01:06:01       35 阅读
  2. 学习MybatisResultSetHandler结果集处理

    2024-06-16 01:06:01       24 阅读
  3. 学习Mybatismybatis实现分页

    2024-06-16 01:06:01       26 阅读
  4. 学习Mybatis执行器Executor

    2024-06-16 01:06:01       27 阅读
  5. MyBatis笔记——参数处理

    2024-06-16 01:06:01       29 阅读
  6. SpringBoot Mybatis-Plus 日志参数

    2024-06-16 01:06:01       29 阅读
  7. Mybatis 批量处理

    2024-06-16 01:06:01       24 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-16 01:06:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-16 01:06:01       100 阅读
  3. 在Django里面运行非项目文件

    2024-06-16 01:06:01       82 阅读
  4. Python语言-面向对象

    2024-06-16 01:06:01       91 阅读

热门阅读

  1. spring

    2024-06-16 01:06:01       29 阅读
  2. git报错:ownership 冲突

    2024-06-16 01:06:01       32 阅读
  3. Spring-AOP总结

    2024-06-16 01:06:01       26 阅读
  4. Docker 镜像****后,如何给Ubuntu手动安装 docker 服务

    2024-06-16 01:06:01       25 阅读
  5. MPLS VPN1

    MPLS VPN1

    2024-06-16 01:06:01      31 阅读
  6. 嵌入式linux中pinctrl子系统驱动用法分析

    2024-06-16 01:06:01       26 阅读
  7. 光流法大全

    2024-06-16 01:06:01       37 阅读
  8. 设计模式之服务定位模式

    2024-06-16 01:06:01       31 阅读
  9. SpringCloud框架的复习(面试)

    2024-06-16 01:06:01       28 阅读