/*
* 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数据持久层框架 v3.5.13
共1901个文件
java:1268个
xml:436个
sql:156个
需积分: 0 0 下载量 174 浏览量
2023-07-01
10:49:58
上传
评论
收藏 2.16MB RAR 举报
温馨提示
MyBatis的前身就是iBatis。是一个数据持久层(ORM)框架。 MyBatis SQL映射器框架使将关系数据库与面向对象的应用程序结合使用变得更加容易。MyBatis使用XML描述符或注释将对象与存储过程或SQL语句耦合。相对于对象关系映射工具,简单性是MyBatis数据映射器的最大优势。 Mybaits的优点: 1、基于SQL语句编程,相当灵活,不会对应用程序或者数据库的现有设计造成任何影响,SQL写在XML里,解除sql与程序代码的耦合,便于统一管理;提供XML标签,支持编写动态SQL语句,并可重用。 2、与JDBC相比,减少了50%以上的代码量,消除了JDBC大量冗余的代码,不需要手动开关连接; 3、很好的与各种数据库兼容(因为MyBatis使用JDBC来连接数据库,所以只要JDBC支持的数据库MyBatis都支持)。 4、能够与Spring很好的集成; 5、提供映射标签,支持对象与数据库的ORM字段关系映射;提供对象关系映射标签,支持对象关系组件维护。 MyBatis框架的缺点: 1、SQL语句的编写工作量较大,尤其当字段多、关联表多时,对开发人员编写SQ
资源推荐
资源详情
资源评论
收起资源包目录
MyBatis数据持久层框架 v3.5.13 (1901个子文件)
mvnw.cmd 7KB
maven.config 79B
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 54KB
Code.java 50KB
ExecutorTestHelper.java 42KB
SqlProviderTest.java 39KB
Configuration.java 35KB
SqlSessionTest.java 32KB
BindingTest.java 32KB
MapperAnnotationBuilder.java 31KB
SPTest.java 24KB
Jdbc3KeyGeneratorTest.java 21KB
PooledDataSource.java 21KB
MapperBuilderAssistant.java 19KB
XMLConfigBuilder.java 19KB
XMLMapperBuilder.java 19KB
BaseExecutorTest.java 19KB
TypeParameterResolverTest.java 18KB
TypeHandlerRegistry.java 18KB
XmlConfigBuilderTest.java 18KB
DynamicSqlSourceTest.java 17KB
Reflector.java 17KB
CursorSimpleTest.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
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
XmlConfigBuilderTest.java 9KB
JavassistProxyFactory.java 9KB
ResultMapping.java 9KB
MappedStatement.java 9KB
ScriptRunner.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
MetaClass.java 6KB
TypeAliasRegistry.java 6KB
BeanWrapper.java 6KB
RepeatableDeleteTest.java 6KB
SqlSourceBuilder.java 6KB
共 1901 条
- 1
- 2
- 3
- 4
- 5
- 6
- 20
资源评论
76725413
- 粉丝: 15
- 资源: 6951
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功