1.场景说明
本文只讲述sql执行之后结果封装,大概流程:根据配置文件中的结果类型(resultType)利用反射创建查询结果对象;然后将statement查询结果给创建的空对象进行赋值.至此完成数据结果集封装.
2.源码调试示例代码
<!--查询资讯信息-->
<select id="findNews" resultType="com.it.txm.demo.controller.News">
select id,title from find_news
</select>
3.结果集封装源码
结果集处理核心方法:DefaultResultSetHandler.java中handleResultSets
public List<Object> handleResultSets(Statement stmt) throws SQLException {
ErrorContext.instance().activity("handling results").object(mappedStatement.getId());
// 存放查询结果的集合
final List<Object> multipleResults = new ArrayList<>();
int resultSetCount = 0;
// 获取结果集处理包装类
ResultSetWrapper rsw = getFirstResultSet(stmt);
// resultMap封装结果集合
List<ResultMap> resultMaps = mappedStatement.getResultMaps();
int resultMapCount = resultMaps.size();
// 校验sql中是否有resultMap结果集,如果没有则异常:A query was run and no Result Maps were found for the Mapped Statement
validateResultMapsCount(rsw, resultMapCount);
while (rsw != null && resultMapCount > resultSetCount) {
//对于存在多个resultMap场景,循环可能会多次,大部分只会执行一次
ResultMap resultMap = resultMaps.get(resultSetCount);
// 结果集封装的核心逻辑
handleResultSet(rsw, resultMap, multipleResults, null);
// 对于嵌套结果集处理(本示例中不执行)
rsw = getNextResultSet(stmt);
cleanUpAfterHandlingResultSet();
resultSetCount++;
}
String[] resultSets = mappedStatement.getResultSets();
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);
}
表字段与类属性进行自动数据映射封装(DefaultResultSetHandler.java中applyAutomaticMappings)
private boolean applyAutomaticMappings(ResultSetWrapper rsw, ResultMap resultMap, MetaObject metaObject, String columnPrefix) throws SQLException {
// 获取字段与属性映射UnMappedColumnAutoMapping对象的集合;
List<UnMappedColumnAutoMapping> autoMapping = createAutomaticMappings(rsw, resultMap, metaObject, columnPrefix);
boolean foundValues = false;
if (!autoMapping.isEmpty()) {
for (UnMappedColumnAutoMapping mapping : autoMapping) {
// 获取查询数据值
final Object value = mapping.typeHandler.getResult(rsw.getResultSet(), mapping.column);
if (value != null) {
foundValues = true;
}
if (value != null || (configuration.isCallSettersOnNulls() && !mapping.primitive)) {
// 利用反射将字段对应的数据赋值给属性,完成对象属性赋值操作;metaObject源对象中的originalObject即为根据resultTpe类型利用反射创建的对象.然后根据查询结果给对象各属性进行赋值;
metaObject.setValue(mapping.property, value);
}
}
}
return foundValues;
}