第114章 MyBatis


MyBatis

Camel 2.7 以降で利用可能
mybatis: コンポーネントを使用すると、MyBatis を使用して、リレーショナルデータベースでデータのクエリー、ポーリング、挿入、更新、および削除を行うことができます。
Maven ユーザーは、このコンポーネントの pom.xml に以下の依存関係を追加する必要があります。
<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-mybatis</artifactId>
    <version>2.17.0.redhat-630xxx</version>
    <!-- use the same version as your Camel core version -->
</dependency>
Copy to Clipboard Toggle word wrap

URI 形式

mybatis:statementName[?options]
Copy to Clipboard Toggle word wrap
ここでの statementName は、評価するクエリー、挿入、更新、または削除の操作にマップする MyBatis XML マッピングファイルのステートメント名です。
URI にクエリーオプションは ?option=value&option=value&.. の形式で追加できます。
このコンポーネントはデフォルトで、想定される名前 SqlMapConfig.xml でクラスパスのルートから MyBatis SqlMapConfig ファイルをロードします。ファイルが別の場所にある場合は、MyBatisComponent コンポーネントで configurationUri オプションを設定する必要があります。

オプション

Expand
オプション デフォルト 説明
consumer.onConsume 文字列 null 消費後に実行するステートメント。たとえば、Camel で消費および処理された後に行を更新するために使用できます。後ほどサンプル を参照してください。複数のステートメントはコンマで区切ることができます。
consumer.useIterator boolean true true の場合、ポーリングが個別に処理されるときに返される各行。false の場合、データの リスト 全体が IN ボディーとして設定されます。
consumer.routeEmptyResultSet boolean false 空の結果セットをルーティングすべきかどうかを設定します。
statementType StatementType null 呼び出す操作の種類を制御するためにプロデューサーに指定する必要があります。enum 値は SelectOneSelectListInsert ListUpdateUpdateListDelete、および DeleteList です。注記:InsertList は Camel 2.10 で利用可能で、UpdateList Camel 2.11 で利用できます。
maxMessagesPerPoll int 0 このオプションは、データベースプールによって返される結果をバッチに分割し、それらを複数のエクスチェンジで配信することを目的としています。この整数は、単一のエクスチェンジで配信する最大メッセージを定義します。デフォルトでは最大値は設定されていません。たとえば制限を 1000 などに設定して、数千のファイルがあるサーバーの起動を回避できます。無効にするには、0 または負の値を設定します。
executorType 文字列 null Camel 2.11: ステートメントの実行中に使用されるエグゼキューターのタイプ。サポートされる値は、simple、re reuse、batch です。デフォルトでは、値は指定されず、MyBatis が使用するもの(つまり simple )と同じです。シンプルな エクゼキューターは特別なことを行いません。エグゼキューターを 再利用 すると、準備済みステートメントが再利用されます。バッチ エグゼキューターは、ステートメントとバッチの更新を再利用します。
outputHeader 文字列 null Camel 2.15: メッセージのボディーではなくヘッダーとして結果を保存します。これにより、既存のメッセージボディーをそのまま保存できます。
inputHeader 文字列 null Camel 2.15: ボディーの代わりにコンポーネントへの入力としてヘッダー値を使用します。
transacted ブール値 false Camel 2.16.2: SQL コンシューマーのみ。トランザクションを有効または無効にします。有効にすると、エクスチェンジの処理に失敗し、コンシューマーは追加のエクスチェンジを処理しなくなり、即時ロールバックが発生します。

メッセージヘッダー

Camel は結果メッセージ(IN または OUT のいずれかのヘッダーに、使用する ステートメントが含まれるヘッダー)を入力します。
Expand
ヘッダー タイプ 説明
CamelMyBatisStatementName 文字列 使用される statementName (例:insertAccount)。
CamelMyBatisResult オブジェクト いずれの操作でも MtBatis から返される 応答。たとえば、INSERT は自動生成キーや行数などを返すことができます。

メッセージボディー

MyBatis からの応答は、SELECT ステートメントの場合のみボディーとして設定されます。たとえば、INSERT ステートメントの場合、Camel はボディーを置き換えません。これにより、ルーティングを継続し、元のボディーを維持することができます。MyBatis からの応答は、常にキー CamelMyBatisResult を持つヘッダーに保存されます。

サンプル

たとえば、JMS キューから Bean を使用し、それらをデータベースに挿入する場合は、以下を実行できます。
from("activemq:queue:newAccount").
  to("mybatis:insertAccount?statementType=Insert");
Copy to Clipboard Toggle word wrap
呼び出す操作の種類を Camel に指示する必要があるため、statementType を指定する必要があることに注意してください。
insertAccount は、SQL マッピングファイルの MyBatis ID に置き換えます。
  <!-- Insert example, using the Account parameter class -->
  <insert id="insertAccount" parameterType="Account">
    insert into ACCOUNT (
      ACC_ID,
      ACC_FIRST_NAME,
      ACC_LAST_NAME,
      ACC_EMAIL
    )
    values (
      #{id}, #{firstName}, #{lastName}, #{emailAddress}
    )
  </insert>
Copy to Clipboard Toggle word wrap

StatementType を使用した MyBatis の制御の改善

MyBatis エンドポイントにルーティングする場合、実行する SQL ステートメントが SELECTUPDATEDELETE、または INSERT などであるかどうかを制御するために、より詳細な制御が必要になります。たとえば、IN ボディーに SELECT ステートメントへのパラメーターが含まれる MyBatis エンドポイントにルーティングする場合は、以下を実行できます。
from("direct:start")
    .to("mybatis:selectAccountById?statementType=SelectOne")
    .to("mock:result");
Copy to Clipboard Toggle word wrap
上記のコードでは、MyBatis ステートメント selectAccountById を呼び出し、IN 本文に 整数 タイプなどの取得するアカウント ID が含まれる必要があります。
SelectList などの他の操作でも同じことができます。
from("direct:start")
    .to("mybatis:selectAllAccounts?statementType=SelectList")
    .to("mock:result");
Copy to Clipboard Toggle word wrap
また UPDATE と同じです。ここでは、Account オブジェクトを IN ボディーとして MyBatis に送信できます。
from("direct:start")
    .to("mybatis:updateAccount?statementType=Update")
    .to("mock:result");
Copy to Clipboard Toggle word wrap

InsertList StatementType の使用

Camel 2.10 以降で利用可能
mybatis では、for-each batch ドライバーを使用して複数の行を挿入できます。これを使用するには、マッパー XML ファイルで <foreach> を使用する必要があります。以下に例を示します。
<!-- Batch Insert example, using the Account parameter class -->
<insert id="batchInsertAccount" parameterType="java.util.List">
    insert into ACCOUNT (
    ACC_ID,
    ACC_FIRST_NAME,
    ACC_LAST_NAME,
    ACC_EMAIL
    )
    values (
    <foreach item="Account" collection="list" open="" close="" separator="),(">
        #{Account.id}, #{Account.firstName}, #{Account.lastName}, #{Account.emailAddress}
    </foreach>
    )
</insert>
Copy to Clipboard Toggle word wrap
次に、以下のように InsertList ステートメントタイプを使用する mybatis エンドポイントに Camel メッセージを送信することで、複数の行を挿入できます。
from("direct:start")
    .to("mybatis:batchInsertAccount?statementType=InsertList")
    .to("mock:result");
Copy to Clipboard Toggle word wrap

UpdateList StatementType の使用

Camel 2.11 から利用可能
mybatis では、for-each batch ドライバーを使用して複数の行を更新できます。これを使用するには、マッパー XML ファイルで <foreach> を使用する必要があります。以下に例を示します。
<update id="batchUpdateAccount" parameterType="java.util.Map">
    update ACCOUNT set
    ACC_EMAIL = #{emailAddress}
    where
    ACC_ID in
    <foreach item="Account" collection="list" open="(" close=")" separator=",">
        #{Account.id}
    </foreach>
</update>
Copy to Clipboard Toggle word wrap
次に、以下のように UpdateList ステートメントタイプを使用する mybatis エンドポイントに Camel メッセージを送信することで、複数の行を更新できます。
from("direct:start")
    .to("mybatis:batchUpdateAccount?statementType=UpdateList")
    .to("mock:result");
Copy to Clipboard Toggle word wrap

DeleteList StatementType の使用

Camel 2.11 から利用可能
mybatis では、for-each batch ドライバーを使用して複数の行を削除できます。これを使用するには、マッパー XML ファイルで <foreach> を使用する必要があります。以下に例を示します。
<delete id="batchDeleteAccountById" parameterType="java.util.List">
    delete from ACCOUNT
    where
    ACC_ID in
    <foreach item="AccountID" collection="list" open="(" close=")" separator=",">
        #{AccountID}
    </foreach>
</delete>
Copy to Clipboard Toggle word wrap
次に、以下のように DeleteList ステートメントタイプを使用する mybatis エンドポイントに Camel メッセージを送信することにより、複数の行を削除できます。
from("direct:start")
    .to("mybatis:batchDeleteAccount?statementType=DeleteList")
    .to("mock:result");
Copy to Clipboard Toggle word wrap

InsertList、UpdateList、および DeleteList StatementTypes に関する通知

すべてのタイプのパラメーター(List、Map など)を mybatis に渡すことができ、エンドユーザーは、mybatis 動的クエリー 機能を利用して必要に応じて処理します。

スケジュールされたポーリングの例

このコンポーネントはスケジュールされたポーリングをサポートするため、Polling Consumer として使用できます。たとえば、データベースを 1 分ごとにポーリングするには、以下を実行します。
from("mybatis:selectAllAccounts?delay=60000").to("activemq:queue:allAccounts");
Copy to Clipboard Toggle word wrap
その他のオプションは、ポーリング コンシューマーの ScheduledPollConsumer Options を参照してください。
または、TimerQuartz コンポーネントなどのスケジュールされたポーリングをトリガーする別のメカニズムを使用することもできます。
以下の例では、Timer コンポーネントを使用して 30 秒ごとにデータベースをポーリングし、データを JMS キューに送信します。
from("timer://pollTheDatabase?delay=30000").to("mybatis:selectAllAccounts").to("activemq:queue:allAccounts");
Copy to Clipboard Toggle word wrap
MyBatis SQL マッピングファイルが使用される:
  <!-- Select with no parameters using the result map for Account class. -->
  <select id="selectAllAccounts" resultMap="AccountResult">
    select * from ACCOUNT
  </select>
Copy to Clipboard Toggle word wrap

onConsume の使用

このコンポーネントは、データが Camel によって消費および処理された のステートメントの実行をサポートします。これにより、データベースで更新後の更新を行うことができます。すべてのステートメントは UPDATE ステートメントである必要があることに注意してください。Camel は、名前をコンマで区切る必要がある複数のステートメントの実行をサポートします。
以下のルートは、consumeAccount ステートメントデータが処理されることを示しています。これにより、データベースの行のステータスを processed に変更できるため、2 回以上消費しないようにします。
from("mybatis:selectUnprocessedAccounts?consumer.onConsume=consumeAccount").to("mock:results");
Copy to Clipboard Toggle word wrap
および sqlmap ファイルのステートメントは、以下のようになります。
<select id="selectUnprocessedAccounts" resultMap="AccountResult">
    select * from ACCOUNT where PROCESSED = false
</select>
Copy to Clipboard Toggle word wrap
<update id="consumeAccount" parameterType="Account">
    update ACCOUNT set PROCESSED = true where ACC_ID = #{id}
</update>
Copy to Clipboard Toggle word wrap

トランザクションへの参加

camel-mybatis でトランザクションマネージャーを設定するには、標準の MyBatis SqlMapConfig.xml ファイル外でデータベース設定を外部化する必要があるため、少し時間がかかる場合があります。
最初の部分では、DataSource を設定する必要があります。通常、これは Spring プロキシーでラップする必要があるプール(DBCP または c3p0)です。このプロキシーは、Spring 以外の DataSource を使用して Spring トランザクションに参加できるようにします(MyBatis SqlSessionFactory はこれのみを行います)。
    <bean id="dataSource" class="org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy">
        <constructor-arg>
            <bean class="com.mchange.v2.c3p0.ComboPooledDataSource">
                <property name="driverClass" value="org.postgresql.Driver"/>
                <property name="jdbcUrl" value="jdbc:postgresql://localhost:5432/myDatabase"/>
                <property name="user" value="myUser"/>
                <property name="password" value="myPassword"/>
            </bean>
        </constructor-arg>
    </bean>
Copy to Clipboard Toggle word wrap
これには、プロパティープレースホルダーを使用してデータベース設定を外部化できるようにする追加の利点があります。
その後、トランザクションマネージャーは、外部 DataSource を管理するように設定されます。
    <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>
Copy to Clipboard Toggle word wrap
mybatis-spring SqlSessionFactoryBean は、同じ DataSource をラップします。
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <!-- standard mybatis config file -->
	<property name="configLocation" value="/META-INF/SqlMapConfig.xml"/>
        <!-- externalised mappers -->
	<property name="mapperLocations" value="classpath*:META-INF/mappers/**/*.xml"/>
    </bean>
Copy to Clipboard Toggle word wrap
その後、camel-mybatis コンポーネントはそのファクトリーで設定されます。
    <bean id="mybatis" class="org.apache.camel.component.mybatis.MyBatisComponent">
        <property name="sqlSessionFactory" ref="sqlSessionFactory"/>
    </bean>
Copy to Clipboard Toggle word wrap
最後に、トランザクション ポリシーはトランザクションマネージャーの上部に定義され、通常どおり使用できます。
    <bean id="PROPAGATION_REQUIRED" class="org.apache.camel.spring.spi.SpringTransactionPolicy">
        <property name="transactionManager" ref="txManager"/>
        <property name="propagationBehaviorName" value="PROPAGATION_REQUIRED"/>
    </bean>

    <camelContext id="my-model-context" xmlns="http://camel.apache.org/schema/spring">
        <route id="insertModel">
            <from uri="direct:insert"/>
            <transacted ref="PROPAGATION_REQUIRED"/>
            <to uri="mybatis:myModel.insert?statementType=Insert"/>
        </route>
    </camelContext>
Copy to Clipboard Toggle word wrap
トップに戻る
Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。 最新の更新を見る.

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

Theme

© 2025 Red Hat