28、参数容器ParameterMapping介绍和解析

来源:互联网 发布:网络微营销 编辑:程序博客网 时间:2024/06/09 20:53

ParameterMapping

ParameterMapping的对应的xml内容

<parameter property="" resultMap="" javaType="" typeHandler="" jdbcType="" mode="" scale=""></parameter>

字段

public class ParameterMapping {    private Configuration configuration;    /**     * 必填     */    private String property;    /**     * mode 属性允许你指定 IN,OUT 或 INOUT 参数。如果参数为 OUT 或 INOUT,参数对象属性的真实值将会被改变,就像你在获取输出参数时所期望的那样。     * 如果 mode 为 OUT(或 INOUT),而且 jdbcType 为 CURSOR(也就是 Oracle 的 REFCURSOR),你必须指定一个 resultMap 来映射结果集到参数类型     */    private ParameterMode mode;    private Class<?> javaType = Object.class;    private JdbcType jdbcType;    /**     * 小数点后保留的位数     */    private Integer numericScale;    /**     * 类型处理器     */    private TypeHandler<?> typeHandler;    private String resultMapId;    private String jdbcTypeName;    private String expression;  }

构造方法

  private ParameterMapping() {    }

此处的构造方法私有,通过内部类的build设计模式,来创建和初始化对象

最后对应的类型处理器,和进行验证
java
public ParameterMapping build() {
resolveTypeHandler();
validate();
return parameterMapping;
}

ParameterMap

一个ParameterMap对应一个SQL语句中所有的参数,就行ParameterMapping的集合

    <parameterMap id="" type=""  >        <parameter property="" resultMap="" javaType="" typeHandler="" jdbcType="" mode="" scale=""></parameter>        <parameter property="" resultMap="" javaType="" typeHandler="" jdbcType="" mode="" scale=""></parameter>        <parameter property="" resultMap="" javaType="" typeHandler="" jdbcType="" mode="" scale=""></parameter>    </parameterMap>

如上所示参数,分别会解析出3个ParameterMapping和一个ParameterMap

字段

public class ParameterMap {    private String id;    private Class<?> type;    private List<ParameterMapping> parameterMappings;    }

其他结构和ParameterMapping类似

解析过程

解析过程非常的简单和ResultMap的解析过程类似

private void parameterMapElement(List<XNode> list) throws Exception {        for (XNode parameterMapNode : list) {            String id = parameterMapNode.getStringAttribute("id");            String type = parameterMapNode.getStringAttribute("type");            Class<?> parameterClass = resolveClass(type);            List<XNode> parameterNodes = parameterMapNode.evalNodes("parameter");            List<ParameterMapping> parameterMappings = new ArrayList<ParameterMapping>();            for (XNode parameterNode : parameterNodes) {                String property = parameterNode.getStringAttribute("property");                String javaType = parameterNode.getStringAttribute("javaType");                String jdbcType = parameterNode.getStringAttribute("jdbcType");                String resultMap = parameterNode.getStringAttribute("resultMap");                String mode = parameterNode.getStringAttribute("mode");                String typeHandler = parameterNode.getStringAttribute("typeHandler");                Integer numericScale = parameterNode.getIntAttribute("numericScale");                ParameterMode modeEnum = resolveParameterMode(mode);                Class<?> javaTypeClass = resolveClass(javaType);                JdbcType jdbcTypeEnum = resolveJdbcType(jdbcType);                @SuppressWarnings("unchecked")                Class<? extends TypeHandler<?>> typeHandlerClass = (Class<? extends TypeHandler<?>>) resolveClass(typeHandler);                ParameterMapping parameterMapping = builderAssistant.buildParameterMapping(parameterClass, property, javaTypeClass, jdbcTypeEnum, resultMap, modeEnum, typeHandlerClass, numericScale);                parameterMappings.add(parameterMapping);            }            builderAssistant.addParameterMap(id, parameterClass, parameterMappings);        }    }

最后调用ParameterMap的build方法

public ParameterMapping buildParameterMapping(      Class<?> parameterType,      String property,      Class<?> javaType,      JdbcType jdbcType,      String resultMap,      ParameterMode parameterMode,      Class<? extends TypeHandler<?>> typeHandler,      Integer numericScale) {    resultMap = applyCurrentNamespace(resultMap, true);    // Class parameterType = parameterMapBuilder.type();    Class<?> javaTypeClass = resolveParameterJavaType(parameterType, property, javaType, jdbcType);    TypeHandler<?> typeHandlerInstance = resolveTypeHandler(javaTypeClass, typeHandler);    return new ParameterMapping.Builder(configuration, property, javaTypeClass)        .jdbcType(jdbcType)        .resultMapId(resultMap)        .mode(parameterMode)        .numericScale(numericScale)        .typeHandler(typeHandlerInstance)        .build();  }        public ParameterMapping build() {            resolveTypeHandler();            validate();            return parameterMapping;        }

总结

parameterMap 这是引用外部 parameterMap 的已经被废弃的方法。使用内联参数映射和 parameterType 属性。

原创粉丝点击