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多平台发布
网友评论