ibatis 지연 로드

4315 단어
ibaits에서 불러오는 지연의 의미는 특정한 대상에 사용할 때 구체적인 데이터를 불러오는 것입니다. 그렇지 않으면 데이터를 불러오지 않습니다.
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;
  }

코드에서 보듯이 에 select 속성을 설정하면 getNested SelectMappingValue () 방법이 호출됩니다.이 메서드에서 ResultLoader를 호출합니다.loadResult() 방법:
  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보다 우수합니다.

좋은 웹페이지 즐겨찾기