Fuse 6 is no longer supported
As of February 2025, Red Hat Fuse 6 is no longer supported. If you are using Fuse 6, please upgrade to Red Hat build of Apache Camel.第72章 iBATIS
iBATIS リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
ibatis: コンポーネントを使用すると、Apache iBATIS を使用して、リレーショナルデータベースでデータのクエリー、ポーリング、挿入、更新、および削除を行うことができます。
Prefer MyBatis
Apache iBatis プロジェクトがアクティブではなくなりました。プロジェクトは Apache の外部に移動し、MyBatis プロジェクトとして知られています。したがって、代わりに MyBatis を使用することが推奨されます。この camel-ibatis コンポーネントは Camel 3.0 で削除されます。
ibatis は Spring 4.x をサポートしません。そのため、Spring 3.x 以前のみを iBatis で使用できます。
Maven ユーザーは、このコンポーネントの
pom.xml
に以下の依存関係を追加する必要があります。
URI 形式 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
ibatis:statementName[?options]
ibatis:statementName[?options]
statementName は、評価するクエリー、挿入、更新、または削除の操作にマップする iBATIS XML 設定ファイルの名前です。
URI にクエリーオプションは
?option=value&option=value&.. の形式で追加できます。
このコンポーネントはデフォルトで、クラスパスのルートから iBatis SqlMapConfig ファイルをロードし、
SqlMapConfig.xml
という名前が付けられたことが予想されます。Spring リソースの読み込みを使用するため、クラスパス
、ファイル
、または http
を接頭辞として使用し、これらのスキームでリソースを読み込むことができます。Camel 2.2 では、setSqlMapConfig (String)
メソッドを使用して iBatisComponent でこれを設定できます。
オプション リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
オプション | 型 | デフォルト | 説明 |
---|---|---|---|
consumer.onConsume
|
文字列
|
null
|
消費後に実行するステートメント。たとえば、Apache Camel で消費および処理された後に行を更新するために使用できます。後ほどサンプル を参照してください。複数のステートメントはコンマで区切ることができます。 |
consumer.useIterator
|
boolean
|
true
|
true の場合、ポーリングが個別に処理されるときに返される各行。false の場合、データの リスト 全体が IN ボディーとして設定されます。
|
consumer.routeEmptyResultSet
|
boolean
|
false
|
Apache Camel 2.0: 空の結果セットをルーティングするかどうかを設定します。デフォルトでは、空の結果セットはルーティングされません。 |
statementType
|
StatementType
|
null
|
Apache Camel 1.6.1/2.0: 呼び出す iBatisis SqlMapClient メソッドを制御するために IbatisProducer に指定する必要があります。enum 値は QueryForObject 、QueryForList 、Insert 、Update 、Delete です。
|
maxMessagesPerPoll
|
int
|
0
|
Apache Camel 2.0: ポーリングごとに収集する最大メッセージを定義する整数。デフォルトでは最大値は設定されていません。たとえば制限を 1000 などに設定して、数千のファイルがあるサーバーの起動を回避できます。無効にするには、0 または負の値を設定します。 |
分離
|
文字列
|
TRANSACTION_REPEATABLE_READ
|
*Camel 2.9:* 文字列 は、のトランザクション分離レベルを定義します。使用できる値は TRANSACTION_NONE、TRANSACTION_READ_UNCOMMITTED、TRANSACTION_READ_COMMITTED、TRANSACTION_REPEATABLE_READ、TRANSACTION_SERIALIZABLE です。 |
分離
|
文字列
|
TRANSACTION_REPEATABLE_READ
|
*Camel 2.9:* 文字列 は、のトランザクション分離レベルを定義します。使用できる値は TRANSACTION_NONE、TRANSACTION_READ_UNCOMMITTED、TRANSACTION_READ_COMMITTED、TRANSACTION_REPEATABLE_READ、TRANSACTION_SERIALIZABLE です。 |
メッセージヘッダー リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Apache Camel は、IN または OUT のいずれかの結果を、使用する operationName のヘッダーで入力します。
ヘッダー | タイプ | 説明 |
---|---|---|
CamelIBatisStatementName
|
文字列
|
Apache Camel 2.0: 使用される statementName (例:insertAccount)。 |
CamelIBatisResult
|
オブジェクト
|
Apache Camel 1.6.2/2.0: いずれかの操作で iBatis から返される 応答。たとえば、INSERT は自動生成キーや行数などを返すことができます。
|
メッセージボディー リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Apache Camel 1.6.2/2.0: iBatis からの応答は、
SELECT
ステートメントである場合にのみボディーとして設定されます。つまり、たとえば、Apache Camel は INSERT
ステートメントではボディーを置き換えません。これにより、ルーティングを継続し、元のボディーを維持することができます。iBatis からの応答は、常にキー CamelIBatisResult
を持つヘッダーに保存されます。
サンプル リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
たとえば、JMS キューから Bean を使用し、それらをデータベースに挿入する場合は、以下を実行できます。
from("activemq:queue:newAccount"). to("ibatis:insertAccount?statementType=Insert");
from("activemq:queue:newAccount").
to("ibatis:insertAccount?statementType=Insert");
statementType
を指定する必要があります。これは、Apache Camel に対して SqlMapClient
操作を呼び出すよう指示します。
insertAccount は、SQL マップファイルの iBatis ID に置き換えます。
StatementType を使用した IBatis の制御の強化 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Apache Camel 1.6.1/2.0 で利用可能: iBatis エンドポイントへのルーティングでは、より詳細な制御が必要です。これにより、実行する SQL ステートメントが
SELEECT
、UPDATE
、DELETE
、または INSERT
であるかを制御できます。これは Apache Camel 1.6.1/2.0 で実行できるようになりました。たとえば、IN ボディーに SELECT
ステートメントへのパラメーターが含まれる iBatis エンドポイントにルーティングする場合は、以下を実行できます。
from("direct:start") .to("ibatis:selectAccountById?statementType=QueryForObject") .to("mock:result");
from("direct:start")
.to("ibatis:selectAccountById?statementType=QueryForObject")
.to("mock:result");
上記のコードでは、iBatis ステートメント
selectAccountById
を呼び出し、IN 本文に 整数
タイプなどの取得するアカウント ID が含まれる必要があります。
QueryForList
などの他の操作でも同じことができます。
from("direct:start") .to("ibatis:selectAllAccounts?statementType=QueryForList") .to("mock:result");
from("direct:start")
.to("ibatis:selectAllAccounts?statementType=QueryForList")
.to("mock:result");
また
UPDATE
と同じです。ここで、Account
オブジェクトを IN ボディーとして iBatis に送信できます。
from("direct:start") .to("ibatis:updateAccount?statementType=Update") .to("mock:result");
from("direct:start")
.to("ibatis:updateAccount?statementType=Update")
.to("mock:result");
スケジュールされたポーリングの例 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
このコンポーネントはスケジュールされたポーリングをサポートしないため、Timer コンポーネントや Quartz コンポーネントなどのスケジュールされたポーリングをトリガーする別のメカニズムを使用する必要があります。
以下の例では、Timer コンポーネントを使用して 30 秒ごとにデータベースをポーリングし、データを JMS キューに送信します。
from("timer://pollTheDatabase?delay=30000").to("ibatis:selectAllAccounts?statementType=QueryForList").to("activemq:queue:allAccounts");
from("timer://pollTheDatabase?delay=30000").to("ibatis:selectAllAccounts?statementType=QueryForList").to("activemq:queue:allAccounts");
また、使用されている iBatis SQL マップファイルは次のとおりです。
<!-- Select with no parameters using the result map for Account class. --> <select id="selectAllAccounts" resultMap="AccountResult"> select * from ACCOUNT </select>
<!-- Select with no parameters using the result map for Account class. -->
<select id="selectAllAccounts" resultMap="AccountResult">
select * from ACCOUNT
</select>
onConsume の使用 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
このコンポーネントは、Apache Camel によってデータが消費および処理された 後 のステートメントの実行をサポートします。これにより、データベースで更新後の更新を行うことができます。すべてのステートメントは
UPDATE
ステートメントである必要があることに注意してください。Apache Camel は、名前をコンマで区切る必要がある複数のステートメントの実行をサポートします。
以下のルートは、consumeAccount ステートメントデータが処理されることを示しています。これにより、データベースの行のステータスを processed に変更できるため、2 回以上消費しないようにします。
from("ibatis:selectUnprocessedAccounts?consumer.onConsume=consumeAccount").to("mock:results");
from("ibatis:selectUnprocessedAccounts?consumer.onConsume=consumeAccount").to("mock:results");
および sqlmap ファイルのステートメントは、以下のようになります。
<select id="selectUnprocessedAccounts" resultMap="AccountResult"> select * from ACCOUNT where PROCESSED = false </select>
<select id="selectUnprocessedAccounts" resultMap="AccountResult">
select * from ACCOUNT where PROCESSED = false
</select>
<update id="consumeAccount" parameterClass="Account"> update ACCOUNT set PROCESSED = true where ACC_ID = #id# </update>
<update id="consumeAccount" parameterClass="Account">
update ACCOUNT set PROCESSED = true where ACC_ID = #id#
</update>