복붙노트

[SPRING] Spring 통합 - 외부 쿼리 JDBC 쿼리

SPRING

Spring 통합 - 외부 쿼리 JDBC 쿼리

그것을 인라인 대신 jdbc 아웃 바운드 게이트웨이에서 큰 SQL 쿼리를 외부화하는 간단한 방법이 있습니까? 그 이유는 만들려는 커다란 쿼리가 많기 때문이며, 우리는이 파일들을 자신의 파일에 올려 놓거나 적어도 콩으로 외부화하려고합니다.

몇 가지주의 사항 :

우리가 다른 많은 아웃 바운드 게이트웨이를 갖게 될 것이라는 것을 고려할 때 이것을 더 잘 조직하는 방법에 대한 제안은 환영합니다 :)

예를 들어, 다음과 같이 "int-jdbc : outbound-gateway"요소에 SQL 인라인을 갖고 싶지는 않습니다.

<int-jdbc:outbound-gateway
         data-source="datasource"
         request-channel="reqChannel"
         reply-channel="respChannel"
         row-mapper="datamapper" max-rows-per-poll="1000"
         query=" SELECT Field1, Field2, ManyOthers
                 FROM Table T
                 JOIN A ON A.id = T.id [... many other joins here ...]
                 WHERE SOMECONDITION=:payload">
</int-jdbc:outbound-gateway>

간단히:

<bean id="myCoolQuery" class="java.lang.String">
    <constructor-arg>
      <value>
        <![CDATA[
                 SELECT Field1, Field2, ManyOthers
                 FROM Table T
                 JOIN A ON A.id = T.id [... many other joins here ...]
                 WHERE SOMECONDITION=:payload
        ]]>
      </value>
    </constructor-arg>
</bean> 

<int-jdbc:outbound-gateway
         data-source="datasource"
         request-channel="reqChannel"
         reply-channel="respChannel"
         row-mapper="datamapper" max-rows-per-poll="1000"
         query="#{myCoolQuery}">
</int-jdbc:outbound-gateway>

또한 bean 내부에서 사용되는 ": payload"매개 변수와도 작동합니다.

해결법

  1. ==============================

    1.XML로 쿼리를 스프링 빈으로 정의 할 수 있습니다.

    XML로 쿼리를 스프링 빈으로 정의 할 수 있습니다.

    <bean id="exampleQuerySql" class="java.lang.String">
        <constructor-arg>
          <value>
              <![CDATA[
    select * from foo
    where whatever_ind = 'A'
              ]]>
          </value>
        </constructor-arg>
    </bean> 
    

    CDATA를 사용하면 쿼리 텍스트에 줄 바꿈, 꺾쇠 괄호 등이 포함될 수 있으므로 읽기 쉽고 SQL 도구에 직접 잘라 붙여 넣을 수 있습니다.

    SpEL을 사용하여 Bean을 참조 할 수 있습니다.

  2. ==============================

    2.예, 속성 파일에 넣을 수 있으며 속성 자리 표시 자 $ {...}를 사용하여 해결하거나 SpEL을 사용할 수 있습니다.

    예, 속성 파일에 넣을 수 있으며 속성 자리 표시 자 $ {...}를 사용하여 해결하거나 SpEL을 사용할 수 있습니다.

    "#{myQueryBean.queryOne}"
    

    여기서 myQueryBean은 메소드가있는 클래스의 인스턴스 인 입니다.

    public String getQueryOne() {...}
    

    또는 클래스의 정적 상수 ...

    "#{T(foo.Queries).QUERY_ONE}"
    
    public static final String QUERY_ONE = "...";
    
  3. from https://stackoverflow.com/questions/25556825/spring-integration-externalizing-jdbc-queries by cc-by-sa and MIT license