320.9. 例
以下のサンプルでは、クエリーを実行し、結果を行の List
として取得します。ここで、各行は Map<String, Object>
であり、キーは列名です。
まず、サンプルに使用するテーブルを設定します。これは単体テストに基づいているため、Java で行います。
実行する SQL スクリプト createAndPopulateDatabase.sql
は、次のようになります。
次に、ルートと SQL
コンポーネントを設定します。SQL
エンドポイントの前に direct
エンドポイントを使用していることに注意してください。これにより、クライアントが長い sql:
URI よりもはるかに使いやすい URI direct:simple
を使用して、direct
エンドポイントにエクスチェンジを送信できます。DataSource
はレジストリーで検索されるため、標準の Spring XML を使用して DataSource
を設定できることに注意してください。
次に、メッセージを direct
エンドポイントに送信します。このエンドポイントは、データベースにクエリーを実行する SQL
コンポーネントにメッセージをルーティングします。
次のように、Spring XML で DataSource
を設定できます。
<jee:jndi-lookup id="myDS" jndi-name="jdbc/myDataSource"/>
320.9.1. 名前付きパラメーターの使用
Camel 2.11 から利用可能
以下の特定のルートでは、projects テーブルからすべてのプロジェクトを取得します。SQL クエリーには、:#lic と :#min という 2 つの名前付きパラメーターがあることに注意してください。
Camel は、メッセージ本文またはメッセージヘッダーからこれらのパラメーターを検索します。上記の例では、2 つのヘッダーに定数値を設定していることに注意してください。
名前付きパラメーターの場合:
from("direct:projects") .setHeader("lic", constant("ASF")) .setHeader("min", constant(123)) .to("sql:select * from projects where license = :#lic and id > :#min order by id")
ただし、メッセージボディーが java.util.Map
の場合、名前付きパラメーターは本文から取得されます。
from("direct:projects") .to("sql:select * from projects where license = :#lic and id > :#min order by id")
320.9.2. 式パラメーターの使用
Camel 2.14 から利用可能
以下の特定のルートでは、データベースからすべてのプロジェクトを取得します。ライセンスを定義するためにエクスチェンジの本文を使用し、プロパティーの値を 2 番目のパラメーターとして使用します。
from("direct:projects") .setBody(constant("ASF")) .setProperty("min", constant(123)) .to("sql:select * from projects where license = :#${body} and id > :#${property.min} order by id")
320.9.3. 動的な値での IN クエリーの使用
Camel 2.17 以降で利用可能
Camel 2.17 以降、SQL プロデューサーは、IN 値が動的に計算される IN ステートメントで SQL クエリーを使用できるようにします。たとえば、メッセージ本文やヘッダーなどから。
IN を使用するには、次のことが必要です。
-
パラメーター名の前に
in:
を追加します。 -
パラメーターの前後に
( )
を追加します。
例はこれをよりよく説明しています。次のクエリーが使用されます。
-- this is a comment select * from projects where project in (:#in:names) order by id
次の経路で:
from("direct:query") .to("sql:classpath:sql/selectProjectsIn.sql") .to("log:query") .to("mock:query");
次に、IN クエリーは、次のような動的な値を持つキー名を持つヘッダーを使用できます。
// use an array template.requestBodyAndHeader("direct:query", "Hi there!", "names", new String[]{"Camel", "AMQ"}); // use a list List<String> names = new ArrayList<String>(); names.add("Camel"); names.add("AMQ"); template.requestBodyAndHeader("direct:query", "Hi there!", "names", names); // use a string separated values with comma template.requestBodyAndHeader("direct:query", "Hi there!", "names", "Camel,AMQ");
クエリーは、外部化する代わりにエンドポイントで指定することもできます (外部化すると SQL クエリーの維持が容易になることに注意してください)。
from("direct:query") .to("sql:select * from projects where project in (:#in:names) order by id") .to("log:query") .to("mock:query");