/*
* Copyright 2009-2023 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.ibatis.executor.resultset;
import java.lang.reflect.Constructor;
import java.lang.reflect.Parameter;
import java.sql.CallableStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import org.apache.ibatis.annotations.AutomapConstructor;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.binding.MapperMethod.ParamMap;
import org.apache.ibatis.cache.CacheKey;
import org.apache.ibatis.cursor.Cursor;
import org.apache.ibatis.cursor.defaults.DefaultCursor;
import org.apache.ibatis.executor.ErrorContext;
import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.executor.ExecutorException;
import org.apache.ibatis.executor.loader.ResultLoader;
import org.apache.ibatis.executor.loader.ResultLoaderMap;
import org.apache.ibatis.executor.parameter.ParameterHandler;
import org.apache.ibatis.executor.result.DefaultResultContext;
import org.apache.ibatis.executor.result.DefaultResultHandler;
import org.apache.ibatis.executor.result.ResultMapException;
import org.apache.ibatis.mapping.BoundSql;
import org.apache.ibatis.mapping.Discriminator;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.mapping.ParameterMapping;
import org.apache.ibatis.mapping.ParameterMode;
import org.apache.ibatis.mapping.ResultMap;
import org.apache.ibatis.mapping.ResultMapping;
import org.apache.ibatis.reflection.MetaClass;
import org.apache.ibatis.reflection.MetaObject;
import org.apache.ibatis.reflection.ReflectorFactory;
import org.apache.ibatis.reflection.factory.ObjectFactory;
import org.apache.ibatis.session.AutoMappingBehavior;
import org.apache.ibatis.session.Configuration;
import org.apache.ibatis.session.ResultContext;
import org.apache.ibatis.session.ResultHandler;
import org.apache.ibatis.session.RowBounds;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.TypeHandler;
import org.apache.ibatis.type.TypeHandlerRegistry;
import org.apache.ibatis.util.MapUtil;
/**
* @author Clinton Begin
* @author Eduardo Macarron
* @author Iwao AVE!
* @author Kazuki Shimizu
*/
public class DefaultResultSetHandler implements ResultSetHandler {
private static final Object DEFERRED = new Object();
private final Executor executor;
private final Configuration configuration;
private final MappedStatement mappedStatement;
private final RowBounds rowBounds;
private final ParameterHandler parameterHandler;
private final ResultHandler<?> resultHandler;
private final BoundSql boundSql;
private final TypeHandlerRegistry typeHandlerRegistry;
private final ObjectFactory objectFactory;
private final ReflectorFactory reflectorFactory;
// nested resultmaps
private final Map<CacheKey, Object> nestedResultObjects = new HashMap<>();
private final Map<String, Object> ancestorObjects = new HashMap<>();
private Object previousRowValue;
// multiple resultsets
private final Map<String, ResultMapping> nextResultMaps = new HashMap<>();
private final Map<CacheKey, List<PendingRelation>> pendingRelations = new HashMap<>();
// Cached Automappings
private final Map<String, List<UnMappedColumnAutoMapping>> autoMappingsCache = new HashMap<>();
private final Map<String, List<String>> constructorAutoMappingColumns = new HashMap<>();
// temporary marking flag that indicate using constructor mapping (use field to reduce memory usage)
private boolean useConstructorMappings;
private static class PendingRelation {
public MetaObject metaObject;
public ResultMapping propertyMapping;
}
private static class UnMappedColumnAutoMapping {
private final String column;
private final String property;
private final TypeHandler<?> typeHandler;
private final boolean primitive;
public UnMappedColumnAutoMapping(String column, String property, TypeHandler<?> typeHandler, boolean primitive) {
this.column = column;
this.property = property;
this.typeHandler = typeHandler;
this.primitive = primitive;
}
}
public DefaultResultSetHandler(Executor executor, MappedStatement mappedStatement, ParameterHandler parameterHandler,
ResultHandler<?> resultHandler, BoundSql boundSql, RowBounds rowBounds) {
this.executor = executor;
this.configuration = mappedStatement.getConfiguration();
this.mappedStatement = mappedStatement;
this.rowBounds = rowBounds;
this.parameterHandler = parameterHandler;
this.boundSql = boundSql;
this.typeHandlerRegistry = configuration.getTypeHandlerRegistry();
this.objectFactory = configuration.getObjectFactory();
this.reflectorFactory = configuration.getReflectorFactory();
this.resultHandler = resultHandler;
}
//
// HANDLE OUTPUT PARAMETER
//
@Override
public void handleOutputParameters(CallableStatement cs) throws SQLException {
final Object parameterObject = parameterHandler.getParameterObject();
final MetaObject metaParam = configuration.newMetaObject(parameterObject);
final List<ParameterMapping> parameterMappings = boundSql.getParameterMappings();
for (int i = 0; i < parameterMappings.size(); i++) {
final ParameterMapping parameterMapping = parameterMappings.get(i);
if (parameterMapping.getMode() == ParameterMode.OUT || parameterMapping.getMode() == ParameterMode.INOUT) {
if (ResultSet.class.equals(parameterMapping.getJavaType())) {
handleRefCursorOutputParameter((ResultSet) cs.getObject(i + 1), parameterMapping, metaParam);
} else {
final TypeHandler<?> typeHandler = parameterMapping.getTypeHandler();
metaParam.setValue(parameterMapping.getProperty(), typeHandler.getResult(cs, i + 1));
}
}
}
}
private void handleRefCursorOutputParameter(ResultSet rs, ParameterMapping parameterMapping, MetaObject metaParam)
throws SQLException {
if (rs == null) {
return;
}
try {
final String resultMapId = parameterMapping.getResultMapId();
final ResultMap resultMap = configuration.getResultMap(resultMapId);
final ResultSetWrapper rsw = new ResultSetWrapper(rs, configuration);
if (this.resultHandler == null) {
final DefaultResultHandler resultHandler = new DefaultResultHandler(objectFactory);
handleRowValues(rsw, resultMap, resultHandler, new RowBounds(), null);
metaParam.setValue(parameterMapping.getProperty(), resultHandler.getResultList());
} else {
handleRowValues(rsw, resultMap, resultHandler, new RowBounds(), null);
}
} finally {
// issue #228 (close resultsets)
closeResultSet(rs);
}
}
//
// HANDLE RESULT SETS
//
@Override
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);
List<ResultMap> resultMaps = mappedStatement.getResultMaps();
int resultMapCount = resultMaps
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
Java 的 MyBatis SQL 映射器框架 (1904个子文件)
mvnw.cmd 7KB
maven.config 96B
site.css 1KB
site.css 1KB
site.css 1KB
site.css 1KB
site.css 1KB
site.css 1KB
mybatis-3-mapper.dtd 7KB
mybatis-3-config.dtd 2KB
.editorconfig 782B
.gitattributes 81B
.gitignore 254B
ICLA 7KB
DefaultResultSetHandler.java 55KB
Code.java 50KB
ExecutorTestHelper.java 42KB
SqlProviderTest.java 39KB
Configuration.java 35KB
SqlSessionTest.java 32KB
BindingTest.java 32KB
MapperAnnotationBuilder.java 31KB
BaseExecutorTest.java 24KB
SPTest.java 24KB
Jdbc3KeyGeneratorTest.java 21KB
PooledDataSource.java 21KB
MapperBuilderAssistant.java 19KB
XMLConfigBuilder.java 19KB
XMLMapperBuilder.java 19KB
TypeParameterResolverTest.java 18KB
TypeHandlerRegistry.java 18KB
XmlConfigBuilderTest.java 18KB
DynamicSqlSourceTest.java 17KB
CursorSimpleTest.java 17KB
Reflector.java 17KB
AbstractSQL.java 16KB
MemberAccessTest.java 14KB
SQLTest.java 14KB
MapperMethod.java 14KB
BaseExecutor.java 13KB
CacheTest.java 13KB
SelectKeyTest.java 12KB
OurSqlBuilder.java 12KB
ReflectorTest.java 12KB
DefaultParameterHandlerTest.java 12KB
Jdbc3KeyGenerator.java 12KB
DefaultVFS.java 12KB
SqlSession.java 11KB
ResultLoaderMap.java 11KB
TypeParameterResolver.java 11KB
ProviderSqlSource.java 11KB
SqlSessionManager.java 11KB
DynSqlTest.java 11KB
MetaObjectTest.java 10KB
ScriptRunnerTest.java 10KB
ResolverUtil.java 10KB
XmlMapperBuilderTest.java 10KB
DefaultSqlSession.java 10KB
XNode.java 10KB
ResultMap.java 10KB
XPathParserTest.java 9KB
ProviderMethodResolutionTest.java 9KB
XMLStatementBuilder.java 9KB
CglibProxyFactory.java 9KB
ScriptRunner.java 9KB
XmlConfigBuilderTest.java 9KB
JavassistProxyFactory.java 9KB
ResultMapping.java 9KB
MappedStatement.java 9KB
SerializableProxyTest.java 9KB
RepeatableSelectTest.java 9KB
XMLScriptBuilder.java 9KB
Resources.java 9KB
XPathParser.java 9KB
UnpooledDataSource.java 9KB
TypeHandlerRegistryTest.java 8KB
BoundBlogMapper.java 8KB
SqlRunner.java 8KB
ForEachTest.java 8KB
VFS.java 8KB
CacheBuilder.java 8KB
AutomappingTest.java 8KB
DefaultResultSetHandlerTest2.java 8KB
ResultSetWrapper.java 7KB
Mapper.java 7KB
Order.java 7KB
ForEachSqlNode.java 7KB
PooledConnection.java 7KB
LanguageTest.java 7KB
RepeatableInsertTest.java 7KB
TestConnection.java 7KB
BoundAuthorMapper.java 7KB
DefaultCursorTest.java 7KB
LazyPropertiesTest.java 6KB
BatchExecutor.java 6KB
ParameterMapping.java 6KB
TypeAliasRegistry.java 6KB
MetaClass.java 6KB
RepeatableDeleteTest.java 6KB
BeanWrapper.java 6KB
共 1904 条
- 1
- 2
- 3
- 4
- 5
- 6
- 20
资源评论
技术小羊
- 粉丝: 803
- 资源: 114
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功