public1.2、PreparedStatementHandler#queryList doQuery(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) throws SQLException { Statement stmt = null; try { Configuration configuration = ms.getConfiguration(); //创建StatementHandler, StatementHandler handler = configuration.newStatementHandler(wrapper, ms, parameter, rowBounds, resultHandler, boundSql); //预编译包括SQL的编译、参数的设置 stmt = prepareStatement(handler, ms.getStatementLog()); //执行查询以及结果集的封装 return handler. query(stmt, resultHandler); } finally { //关闭 closeStatement(stmt); } }
@Override public2、结果集处理DefaultResultSetHandler 2.1、DefaultResultSetHandler#handleResultSetsList query(Statement statement, ResultHandler resultHandler) throws SQLException { PreparedStatement ps = (PreparedStatement) statement; //执行SQL ps.execute(); //结果集处理,见2、结果集处理DefaultResultSetHandler return resultSetHandler. handleResultSets(ps); }
public List2.2、DefaultResultSetHandler#handleRowValuesForSimpleResultMap
private void handleRowValuesForSimpleResultMap(ResultSetWrapper rsw, ResultMap resultMap, ResultHandler> resultHandler, RowBounds rowBounds, ResultMapping parentMapping)
throws SQLException {
DefaultResultContext resultContext = new DefaultResultContext();
//处理跳过某些无效的行
skipRows(rsw.getResultSet(), rowBounds);
while (shouldProcessMoreRows(resultContext, rowBounds) && rsw.getResultSet().next()) {
ResultMap discriminatedResultMap = resolveDiscriminatedResultMap(rsw.getResultSet(), resultMap, null);
//解析查询结果,见2.3、DefaultResultSetHandler#getRowValue
Object rowValue = getRowValue(rsw, discriminatedResultMap);
//将结果保存到resultHandler,见2.5
storeObject(resultHandler, resultContext, rowValue, parentMapping, rsw.getResultSet());
}
}
2.3、DefaultResultSetHandler#getRowValue
方法中会触发createResultObject进行结果对象的创建。如果是自定义类型的对象(结果对象类型没有在typeHandlerRegistry中注册过。)则会创建一个空的结果对象。如果结果对象在typeHandlerRegistry中注册过则会调用相应的handler进行结果的处理。
private Object getRowValue(ResultSetWrapper rsw, ResultMap resultMap) throws SQLException {
final ResultLoaderMap lazyLoader = new ResultLoaderMap();
//结果对象的创建,见2.3.1、DefaultResultSetHandler#createResultObject
Object rowValue = createResultObject(rsw, resultMap, lazyLoader, null);
//如果是通过typehandler创建的则rowvale即为结果对象了,会直接被返回,否则rowvalue为查询结果,需要进入此分支进行最终的结果对象封装
if (rowValue != null && !hasTypeHandlerForResultObject(rsw, resultMap.getType())) {
//将结果对象rowValue包装到metaObject中,在下面的代码中进行属性赋值是都是使用metaObject进行统一的赋值操作
final metaObject metaObject = configuration.newmetaObject(rowValue);
boolean foundValues = this.useConstructorMappings;
if (shouldApplyAutomaticMappings(resultMap, false)) {
foundValues = applyAutomaticMappings(rsw, resultMap, metaObject, null) || foundValues;
}
//进行属性的赋值,见2.4、属性赋值DefaultResultSetHandler#applyPropertyMappings
foundValues = applyPropertyMappings(rsw, resultMap, metaObject, lazyLoader, null) || foundValues;
foundValues = lazyLoader.size() > 0 || foundValues;
rowValue = (foundValues || configuration.isReturnInstanceForEmptyRow()) ? rowValue : null;
}
return rowValue;
}
2.3.1、DefaultResultSetHandler#createResultObject
private Object createResultObject(ResultSetWrapper rsw, ResultMap resultMap, ResultLoaderMap lazyLoader, String columnPrefix) throws SQLException {
this.useConstructorMappings = false; // reset previous mapping result
final List> constructorArgTypes = new ArrayList>();
final List constructorArgs = new ArrayList();
Object resultObject = createResultObject(rsw, resultMap, constructorArgTypes, constructorArgs, columnPrefix);
if (resultObject != null && !hasTypeHandlerForResultObject(rsw, resultMap.getType())) {
final List propertyMappings = resultMap.getPropertyResultMappings();
for (ResultMapping propertyMapping : propertyMappings) {
// issue gcode #109 && issue #149
if (propertyMapping.getNestedQueryId() != null && propertyMapping.isLazy()) {
resultObject = configuration.getProxyFactory().createProxy(resultObject, lazyLoader, configuration, objectFactory, constructorArgTypes, constructorArgs);
break;
}
}
}
this.useConstructorMappings = (resultObject != null && !constructorArgTypes.isEmpty()); // set current mapping result
return resultObject;
}
private Object createResultObject(ResultSetWrapper rsw, ResultMap resultMap, List> constructorArgTypes, List constructorArgs, String columnPrefix)
throws SQLException {
final Class> resultType = resultMap.getType();
final metaClass metaType = metaClass.forClass(resultType, reflectorFactory);
final List constructorMappings = resultMap.getConstructorResultMappings();
//判断结果类型是否已经被注册过,有则进入否则继续往下判断
if (hasTypeHandlerForResultObject(rsw, resultType)) {
//调用已经注册过的handler进行结果的处理。见2.3.2、DefaultResultSetHandler#createPrimitiveResultObject
return createPrimitiveResultObject(rsw, resultMap, columnPrefix);
//有参构造方法创建
} else if (!constructorMappings.isEmpty()) {
return createParameterizedResultObject(rsw, resultType, constructorMappings, constructorArgTypes, constructorArgs, columnPrefix);
//是一个接口或则有默认的构造器则进入此分支,默认一般是进入到这里
} else if (resultType.isInterface() || metaType.hasDefaultConstructor()) {
return objectFactory.create(resultType);
} else if (shouldApplyAutomaticMappings(resultMap, false)) {
return createByConstructorSignature(rsw, resultType, constructorArgTypes, constructorArgs, columnPrefix);
}
throw new ExecutorException("Do not know how to create an instance of " + resultType);
}
2.3.2、DefaultResultSetHandler#createPrimitiveResultObject
private Object createPrimitiveResultObject(ResultSetWrapper rsw, ResultMap resultMap, String columnPrefix) throws SQLException {
final Class> resultType = resultMap.getType();
final String columnName;
if (!resultMap.getResultMappings().isEmpty()) {
final List resultMappingList = resultMap.getResultMappings();
final ResultMapping mapping = resultMappingList.get(0);
columnName = prependPrefix(mapping.getColumn(), columnPrefix);
} else {
columnName = rsw.getColumnNames().get(0);
}
//此处会根据结果对象的类型获取对应的typeHandler
final TypeHandler> typeHandler = rsw.getTypeHandler(resultType, columnName);
//使用typehandler进行结果处理
return typeHandler.getResult(rsw.getResultSet(), columnName);
}
2.4、属性赋值DefaultResultSetHandler#applyPropertyMappings
private boolean applyPropertyMappings(ResultSetWrapper rsw, ResultMap resultMap, metaObject metaObject, ResultLoaderMap lazyLoader, String columnPrefix)
throws SQLException {
final List mappedColumnNames = rsw.getMappedColumnNames(resultMap, columnPrefix);
boolean foundValues = false;
final List propertyMappings = resultMap.getPropertyResultMappings();
for (ResultMapping propertyMapping : propertyMappings) {
String column = prependPrefix(propertyMapping.getColumn(), columnPrefix);
if (propertyMapping.getNestedResultMapId() != null) {
// the user added a column attribute to a nested result map, ignore it
column = null;
}
if (propertyMapping.isCompositeResult()
|| (column != null && mappedColumnNames.contains(column.toUpperCase(Locale.ENGLISH)))
|| propertyMapping.getResultSet() != null) {
Object value = getPropertyMappingValue(rsw.getResultSet(), metaObject, propertyMapping, lazyLoader, columnPrefix);
// issue #541 make property optional
final String property = propertyMapping.getProperty();
if (property == null) {
continue;
} else if (value == DEFERED) {
foundValues = true;
continue;
}
if (value != null) {
foundValues = true;
}
if (value != null || (configuration.isCallSettersOnNulls() && !metaObject.getSetterType(property).isPrimitive())) {
// gcode issue #377, call setter on nulls (value is not 'found')
//进行赋值
metaObject.setValue(property, value);
}
}
}
return foundValues;
}
2.5、DefaultResultSetHandler#storeObject
private void storeObject(ResultHandler> resultHandler, DefaultResultContextresultContext, Object rowValue, ResultMapping parentMapping, ResultSet rs) throws SQLException { if (parentMapping != null) { linkToParents(rs, parentMapping, rowValue); } else { callResultHandler(resultHandler, resultContext, rowValue); } } @SuppressWarnings("unchecked" ) private void callResultHandler(ResultHandler> resultHandler, DefaultResultContext resultContext, Object rowValue) { resultContext.nextResultObject(rowValue); ((ResultHandler ) resultHandler).handleResult(resultContext); }



