mybatis3.4.1源代码 - 参数处理器、结果集处理器

14 篇文章 0 订阅

 

绑定参数
org.apache.ibatis.scripting.defaults.DefaultParameterHandler#setParameters

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);
            if (parameterMapping.getMode() != ParameterMode.OUT) {
                Object value;
                String propertyName = parameterMapping.getProperty(); // 属性名 foo.account --- 《要绑定的变量名》
                if (boundSql.hasAdditionalParameter(propertyName)) { // 带.符号和带[符号的,  issue #448 ask first for additional params
                    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(); // 数据库的类型 org.apache.ibatis.type.JdbcType.VARCHAR
                if (value == null && jdbcType == null) {
                    jdbcType = configuration.getJdbcTypeForNull(); // JdbcType.OTHER
                }
                try {
                    // org.apache.ibatis.type.StringTypeHandler
                    typeHandler.setParameter(ps, i + 1, value, jdbcType);
                } catch (TypeException e) {
                    throw new TypeException("Could not set parameters for mapping: " + parameterMapping + ". Cause: " + e, e);
                } catch (SQLException e) {
                    throw new TypeException("Could not set parameters for mapping: " + parameterMapping + ". Cause: " + e, e);
                }
            }
        }
    }
}


处理结果集列表

ResultSets = [ // 《批量结果集列表》,要数据库支持
    ResultSet : [ // 记录列表 ResultSetWrapper
        Result {id:1, name:"name_1",pwd:"pwd_1"}, // 一行记录
        Result {id:2, name:"name_2",pwd:"pwd_2"},
        Result {id:3, name:"name_3",pwd:"pwd_3"}
    ],
    ResultSet :[
        Result {id:1, name:"name_1",pwd:"pwd_1"},
        Result {id:2, name:"name_2",pwd:"pwd_2"},
        Result {id:3, name:"name_3",pwd:"pwd_3"}
    ]
]


org.apache.ibatis.executor.resultset.ResultSetHandler#handleResultSets



public List<Object> handleResultSets(Statement stmt) throws SQLException { // java.sql.Statement
    ErrorContext.instance().activity("handling results").object(mappedStatement.getId());

    final List<Object> multipleResults = new ArrayList<Object>();

    int resultSetCount = 0;

    // org.apache.ibatis.executor.resultset.ResultSetWrapper
    ResultSetWrapper rsw = getFirstResultSet(stmt); // 获取第一个结果集,并用ResultSetWrapper包装

    List<ResultMap> resultMaps = mappedStatement.getResultMaps(); // (通过注解 @ResultMap("resultMap1,resultMap2")得到 或者 “解析返回参数并内建” 得到 或者 解析注解@ConstructorArgs、@Results、@TypeDiscriminator)

    int resultMapCount = resultMaps.size(); // 配置的“结果集定义”的数量
    validateResultMapsCount(rsw, resultMapCount); // resultMaps数量必须大于0
    /*
       ResultSets = [ // 《批量结果集列表》,要数据库支持
            ResultSet : [ // 记录列表 ResultSetWrapper
                Result {id:1, name:"name_1",pwd:"pwd_1"}, // 一行记录
                Result {id:2, name:"name_2",pwd:"pwd_2"},
                Result {id:3, name:"name_3",pwd:"pwd_3"}
            ],
            ResultSet :[
                Result {id:1, name:"name_1",pwd:"pwd_1"},
                Result {id:2, name:"name_2",pwd:"pwd_2"},
                Result {id:3, name:"name_3",pwd:"pwd_3"}
            ]
        ]
   */
    while (rsw != null && resultMapCount > resultSetCount) { // “结果集定义”的数量 大于 “数据库返回的结果集”数量(即:数据库的某个结果集有配置映射信息)
        ResultMap resultMap = resultMaps.get(resultSetCount); // 第N个结果集映射器 org.apache.ibatis.mapping.ResultMap / ResultMap 描述的是某一行数据怎么映射的信息

        handleResultSet(rsw, resultMap, multipleResults, null); // !!! 处理结果集(即:行列表),遍历结果列表,创建model对象,并填充db数据到model对象。model对象如:OrderEntity

        rsw = getNextResultSet(stmt); // 获取下一个结果集
        cleanUpAfterHandlingResultSet();
        resultSetCount++;
    }


    String[] resultSets = mappedStatement.getResultSets(); // !!!!  通过注解 @Options(resultSets="resultSets1")得到 ,多结果集的支持
    if (resultSets != null) {
        while (rsw != null && resultSetCount < resultSets.length) { //  “数据库返回的结果集”数量 小于 “预定义的结果集”数量
            ResultMapping parentMapping = nextResultMaps.get(resultSets[resultSetCount]);
            if (parentMapping != null) { // 父级
                String nestedResultMapId = parentMapping.getNestedResultMapId(); // 嵌套
                ResultMap resultMap = configuration.getResultMap(nestedResultMapId);
                handleResultSet(rsw, resultMap, null, parentMapping);
            }
            rsw = getNextResultSet(stmt);
            cleanUpAfterHandlingResultSet();
            resultSetCount++;
        }
    }

    return collapseSingleResultList(multipleResults); // 返回一个结果集
}




 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值