Spring集成 - 外部化JDBC查询

时间:2014-08-28 19:46:19

标签: java spring groovy spring-integration

是否有一种简单的方法可以从jdbc出站网关外部化大sql查询,而不是内联它?原因是我们需要进行许多大型查询,并且我们希望将它们放在自己的文件中,或者至少将它们外部化为bean。

一些警告:

  • 我无法控制数据库,因此我无法创建任何内容 那里(例如存储过程)
  • 我不想为这件事创建课程,我只是想组织/重构一下,而不是让它更复杂 介绍许多其他步骤
  • 我更喜欢创建裸.sql文件,但是将查询放在带有bean的xml中也没关系
  • 我没有选择使用hibernate,坚持使用spring integration jdbc

关于如何更好地组织这个的建议,考虑到我们将有许多其他出站网关,欢迎:)

例如,我不想在" 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>

它也适用于&#34;:payload&#34; bean内部使用的参数。

2 个答案:

答案 0 :(得分:2)

是的,您可以将它们放在属性文件中,并使用属性占位符${...}来解决它们,或者您可以使用SpEL ...

"#{myQueryBean.queryOne}"

其中myQueryBean<bean/>,它是带有方法的类的实例...

public String getQueryOne() {...}

或类上的静态常量......

"#{T(foo.Queries).QUERY_ONE}"

public static final String QUERY_ONE = "...";

答案 1 :(得分:2)

您可以将XML中的查询定义为spring beans:

<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。