resultset 遍历接下来,我们需要设置参数到sql中了,JDBC 提供了三种 Statement 接⼝,分别是 Statement、PreparedStatement 和 CallableStatement。他们的uml图为:
image.png
statement:提供执⾏的sql语句
PreparedStatement:对输⼊参数执⾏动态替换,也就是将之前的?替换为具体的参数
CallableStatement:⽤于保存存储过程输出的结果
我们来来分析PreparedStatement
image.png
每⼀个?都会在parameterMappings集合中⽣成⼀个对象属性,执⾏完之后,⼀条正正的sql就形成了
image.png
当我们执⾏完sql后就要开始处理查询结果了结果集的处理⼯作由结果集处理器 ResultSetHandler 执⾏。ResultSetHandler 是⼀个接⼝,它只有⼀个实现类 DefaultResultSetHandler。结果集的处理⼊⼝⽅法是 handleResultSets,下⾯来看⼀下该⽅法的实现。
@Override
public <E> List<E> query(Statement statement, ResultHandler resultHandler) throws SQLException {
PreparedStatement ps = (PreparedStatement) statement;
return resultSetHandler.<E> handleResultSets(ps);
}
@Override
public List<Object> handleResultSets(Statement stmt) throws SQLException {
ErrorContext.instance().activity("handling results").Id());
final List<Object> multipleResults = new ArrayList<Object>();
int resultSetCount = 0;
//获取第⼀个结果集
ResultSetWrapper rsw = getFirstResultSet(stmt);
List<ResultMap> resultMaps = ResultMaps();
int resultMapCount = resultMaps.size();
validateResultMapsCount(rsw, resultMapCount);
while (rsw != null && resultMapCount > resultSetCount) {
ResultMap resultMap = (resultSetCount);
// 处理结果集
handleResultSet(rsw, resultMap, multipleResults, null);
// 获取下⼀个结果集
rsw = getNextResultSet(stmt);
cleanUpAfterHandlingResultSet();
resultSetCount++;
}
String[] resultSets = ResultSets();
if (resultSets != null) {
while (rsw != null && resultSetCount < resultSets.length) {
ResultMapping parentMapping = (resultSets[resultSetCount]);
if (parentMapping != null) {
String nestedResultMapId = NestedResultMapId();
ResultMap resultMap = ResultMap(nestedResultMapId);
handleResultSet(rsw, resultMap, null, parentMapping);
}
rsw = getNextResultSet(stmt);
cleanUpAfterHandlingResultSet();
resultSetCount++;
}
}
return collapseSingleResultList(multipleResults);
}
private ResultSetWrapper getFirstResultSet(Statement stmt) throws SQLException {
//获取结果集
ResultSet rs = ResultSet();
while (rs == null) {
// move forward to get the first resultset in case the driver

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。