ibatis 지연 로드
ibatis에서 데이터베이스를 질의할 때 ResultMap가 호출됩니다.getResults(StatementScope statementScope, ResultSet rs) 방법은 다음과 같습니다.
public Object[] getResults(StatementScope statementScope, ResultSet rs)
throws SQLException {
ErrorContext errorContext = statementScope.getErrorContext();
errorContext.setActivity("applying a result map");
errorContext.setObjectId(this.getId());
errorContext.setResource(this.getResource());
errorContext.setMoreInfo("Check the result map.");
boolean foundData = false;
Object[] columnValues = new Object[getResultMappings().length];
for (int i = 0; i < getResultMappings().length; i++) {
ResultMapping mapping = (ResultMapping) getResultMappings()[i];
errorContext.setMoreInfo(mapping.getErrorString());
if (mapping.getStatementName() != null) {
if (resultClass == null) {
throw new SqlMapException("The result class was null when trying to get results for ResultMap named " + getId() + ".");
} else if (Map.class.isAssignableFrom(resultClass)) {
Class javaType = mapping.getJavaType();
if (javaType == null) {
javaType = Object.class;
}
columnValues[i] = getNestedSelectMappingValue(statementScope, rs, mapping, javaType);
} else if (DomTypeMarker.class.isAssignableFrom(resultClass)) {
Class javaType = mapping.getJavaType();
if (javaType == null) {
javaType = DomTypeMarker.class;
}
columnValues[i] = getNestedSelectMappingValue(statementScope, rs, mapping, javaType);
} else {
Probe p = ProbeFactory.getProbe(resultClass);
Class type = p.getPropertyTypeForSetter(resultClass, mapping.getPropertyName());
columnValues[i] = getNestedSelectMappingValue(statementScope, rs, mapping, type);
}
foundData = foundData || columnValues[i] != null;
} else if (mapping.getNestedResultMapName() == null) {
columnValues[i] = getPrimitiveResultMappingValue(rs, mapping);
if (columnValues[i] == null) {
columnValues[i] = doNullMapping(columnValues[i], mapping);
} else {
foundData = true;
}
}
}
statementScope.setRowDataFound(foundData);
return columnValues;
}
코드에서 보듯이
public static Object loadResult(SqlMapClientImpl client, String statementName, Object parameterObject, Class targetType)
throws SQLException {
Object value = null;
if (client.isLazyLoadingEnabled()) {
if (client.isEnhancementEnabled()) {
EnhancedLazyResultLoader lazy = new EnhancedLazyResultLoader(client, statementName, parameterObject, targetType);
value = lazy.loadResult();
} else {
LazyResultLoader lazy = new LazyResultLoader(client, statementName, parameterObject, targetType);
value = lazy.loadResult();
}
} else {
value = getResult(client, statementName, parameterObject, targetType);
}
return value;
}
이 방법에는 지연 적재 기술이 사용되었다.물론 지연 로드를 사용하려면 구성 파일에 lazyLoadingEnabled를 true로 설정해야 합니다.
<settings lazyLoadingEnabled="true" />
이렇게 해야만,ibatis는 지연 불러오기를 사용할 수 있으며, 그렇지 않으면, 직접 조회를 실행할 수 있습니다.ibatis에는 로드 지연을 담당하는 두 가지 클래스가 있습니다.
1、LazyResultLoader
2、EnhancedLazyResultLoader.
상기 코드에서 보듯이 속성 enhancementEnabled가true로 설정되면 강화된 지연 불러오기를 사용합니다.그러나 이 속성을true로 만들려면 설정 파일에enhancementEnabled를 설정하는 것 외에 넷이 필요합니다.sf.cglib.proxy.InvocationHandler 클래스.
등록 정보 enhancementEnabled가 false이면 LazyResultLoader가 사용됩니다.이 클래스는 InvocationHandler 인터페이스를 실현했기 때문에 이런 방식은 동적 에이전트 방식을 사용한 것이 분명하다.LazyResultLoader를 호출합니다.loadResult (), 대상 대상 대상 대상이 Collection 또는 하위 클래스라면, 콜렉션 형식이 아닌 프록시 대상을 되돌려줍니다.이를 통해 알 수 있듯이 LazyResultLoader를 사용하여 로드 지연을 실현할 때 대상 객체가 Collection 유형인 데이터에만 유효합니다.요약:
LazyResultLoader는 Collection 유형의 속성만 불러올 수 있고, EnhancedLazyResultLoader는 Collection 유형의 속성과 사용자 정의 유형의 속성을 불러올 수 있으며, 성능은 LazyResultLoader보다 우수합니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.