executor包参数处理功能
灰太狼_cxh 人气:0sql语句中的参数赋值是有由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); } } } } } }
加载全部内容