绑定参数
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); // 返回一个结果集
}