MyBatis로 소스 코드 분석 : 내부하는 SqlCommand의 정적 집단 소송 MapperMethod

내부 정적 집단 소송에 MapperMethod하는 SqlCommand

 

   MapperMethod 초기화에서, 두 우선하는 SqlCommand가 MapperMethod 클래스 () 메소드를 실행 주로하는 SqlCommand의 역할, 그 중 하나는 내부 정적 클래스를 초기화 할 것이다하는 SqlCommand은하기위한 방법 및 쿼리 유형 두 식별 정보를 제공하는 Sqlseesion 다른 방법을 수행하는 사용하기 때문에 SqlCommand를 어떻게 쿼리 유형 및 방법 이드에 도달하는 것입니다? 어느 내가 무엇을 한거야?

  첫째, 실행 순서 생성자의 코드를 보면. 클래스 생성자는 구성, 매퍼 방법 클래스와 인터페이스를 통과해야합니다.

  1. 경로 이름을 획득하는 방법 및 클래스 여기서 분석법 클래스 방법
  2. 획득 한 XML 기반의 구성 및 인터페이스 정보 매퍼 클래스에 해당하는 객체를 MapperStatement
  3. 개체가 매핑되어 있는지 문을 결정하는 것은 다음 ID와 구문의 SQL 형을 유도 NULL하지 않을 경우 NULL이 다시 방법을 결정하는 경우에 실행되는 세척주의 사항 표시 여부를 조건이 후, 만족하지 않는 경우, 실행하기, NULL입니다 BindingException 예외가 발생합니다.

  다음 순서도는 다음과 같습니다

     

그것은 취득 목표의 실현이 resolveMappedStatement () 메서드를 호출하여 문을 맵핑되는 것을 주목할 필요가있다. 다음 정보를 참조하십시오.

. (1 개)   공개 SqlCommand에 (설정 구성, 클래스 <?> MapperInterface 방법 방법) {
 2       // 메소드 이름 얻기 
3.          최종 문자열 methodName로 = method.getName ()
 . 4       // 클래스 위치를 얻는 방법 
. (5)          최종 <?> 클래스 declaringClass = method.getDeclaringClass ()
 . 6      //는 매핑 정보 문 얻었다 
. 7        MappedStatement MS = resolveMappedStatement (mapperInterface, methodName로, declaringClass,
 . 8            구성)
 . 9        // 지도 문 객체가 NULL이면 경우 라벨 FLUSH 방법에 표시된보기 그렇다면, 그렇지 않으면 예외가 발생합니다 BindingException 표현이 인터페이스 정의를 찾을 수 없습니다, 쿼리 유형 FLUSH을 설정합니다. 
10        IF(MS ==의 널 (null) ) {
 (11).          경우 (method.getAnnotation (플러시. 클래스 )! = null이가 ) {
 (12)가            이름 = 널 (null) ;
 (13)는            입력 = ; SqlCommandType.FLUSH
 14          } 다른 {
 15            던져  새로운 새로운 BindingException ( "잘못된 바운드 계산서 (안 ) 발견 : "
 16                mapperInterface.getName + () +." "+ methodName로)
 17.          }
 (18)가        }
 19.        // 종류를 알 수없는 경우지도 문 객체가 비어 있지 않은 경우, 다음 지정된 조회 유형을 설정, 직접 던져 BindingException 이상 
20       {
 21          명 = ms.getId ();
22          종류 = ms.getSqlCommandType ();
23 일          경우 (유형 == SqlCommandType.UNKNOWN) {
 24            스로인  새로운 BindingException ( "알 수없는 실행 방법에있어서,"+ 이름);
25          }
 26        }
 27      }

resolveMappedStatement () 메소드

   이 방법은 주로 ID와 SQL 문뿐만 아니라 참조 및 참조 정보를 제공해야 선택, 업데이트, 삭제, 삽입과 같은 XML 구성에지도 문 객체를 획득, MappedStatement 자바 객체에 대한 XML이 매핑은 < 프리젠 테이션에 전념 할 것입니다 후속으로, 현재의 이해에 MappedStatement 객체에 해당한다 //> 태그를 선택합니다. 이제 코드 실행 흐름에 대한 간략한 설명입니다.

1. 성명을 확보하는 ID 번호, 클래스 경로의 형태로 ID 번호를 실행합니다. 메소드의 이름

2. 구성 클래스의 구문의 ID를 찾을 수 있다면 당신이 찾아 낼 수있는 경우에, 다음 클래스 구성에서 직접 MappedStatement 인스턴스를 반환하거나 발견되지 않는 경우는 부모 클래스 인터페이스 또는 NULL에서 찾기 위해 계속

3. 기준 클래스 인터페이스 경로이면 어디 경로에있어서, 상기 직접 복귀 NULL

 

. 한  개인 MappedStatement resolveMappedStatement (클래스 <?> MapperInterface, 문자열 methodName로,
 2          등급 <?> DeclaringClass, 구성 구성) {
 . 3          // 문 ID의 형태로 인터페이스의 이름을 가져옵니다. 방법 이름 
. 4        문자열 StatementId mapperInterface.getName = () +. " "+ methodName로]
 . 5        // 구성 ID의 방법이 있는지의 여부를 판정한다 
(6).        IF (configuration.hasStatement (StatementId가)) {
 7.            // 문 복귀지도 
8.          configuration.getMappedStatement (StatementId)
 . 9        }
 10        // 인터페이스 정보이면 어디에서 그런 종류의 직접 반환 NULL 
(11)        다른 IF (mapperInterface.equals (declaringClass)) {
 12은           ;
 13이다        }
 14        // 클래스 인터페이스에서의 모든 정보를 얻을 
15         (클래스 <?> 슈퍼를 : mapperInterface.getInterfaces ()) {
 16            // 상위 인터페이스 대응 방법 ID를 검색하거나 찾는 순환 방식을 다음과 같은 구문을 사용하여 
17.          IF (declaringClass.isAssignableFrom (수퍼이)) {
 18은            MappedStatement MS = resolveMappedStatement (슈퍼, methodName로,
 19.                declaringClass, 구성)
 (20)는            IF (! MS = {)
 21              MS;
22            }
 23          }
 24        }
 25        반환  ;
26      }
 27    }

 

추천

출처www.cnblogs.com/zhengzuozhanglina/p/11221289.html