/*
* 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
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
MyBatis SQL 映射器框架使得在面向对象的应用程序中使用关系数据库变得更加容易。MyBatis 使用 XML 描述符或注释将对象与存储过程或 SQL 语句结合起来。简单性是 MyBatis 数据映射器相对于对象关系映射工具的最大优势。 Mybatis-core 现在正在自动格式化。考虑到 mybatis 某些代码逻辑的性质,对于诸如 sql 语句之类的片段手动强制格式化结构更为合适。为此,请在代码周围添加以下块。 // @formatter:off开始未格式化的代码块 // @formatter:on结束未格式化的代码块 如果注释部分需要相同的行为(例如 javadoc),请注意整个块必须围绕整个注释,因为直接使用并不能正确指示格式化程序将其全部视为一个注释块。
资源推荐
资源详情
资源评论
收起资源包目录
免费开源!!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
DefaultParameterHandlerTest.java 12KB
ReflectorTest.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
资源评论
Web面试那些事儿
- 粉丝: 4918
- 资源: 101
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- Flume进阶-自定义拦截器jar包
- Dubins曲线算法讲解和在运动规划中的使用.pdf
- 上市公司-股票性质数据-工具变量(民企、国企、央企)2003-2022年.dta
- 上市公司-股票性质数据-工具变量(民企、国企、央企)2003-2022年.xlsx
- Reeds+Shepp曲线算法讲解和实现.pdf
- 毕业设计基于SpringBoot+MyBatisPlus+MySQL+Vue的外卖配送信息系统源代码+数据库
- 词向量(Word Embeddings)是自然语言处理(NLP)领域的一种重要技术.txt
- Surfer,线性函数
- MyBatis 的动态 SQL 是其核心特性之一.txt
- 时代的sdddsddsddsd
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功