データベースのデータの挿入、更新、および削除 - Mule 4

データベース用 Anypoint Connector (Database Connector) では、データベースのデータを管理できるようにする ​Insert​、​Update​、​Delete​ 操作がサポートされています。

次の例では、​electronic​ という名前のテーブルが含まれる ​Products​ という名前のデータベーススキーマのデータを挿入、更新、削除します。このテーブルには、​id​、​name​、​description​、​price​、​discount​ という列が含まれます。

次の SQL ステートメントでは、このテーブルを作成します。

CREATE TABLE electronic(
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100),
    description VARCHAR(255),
    price SMALLINT,
    discount TINYINT
)

Studio で Insert 操作を設定する

テーブル ​electronic​ がすでに作成されていて、​dbConfig​ という名前の Database Connector 接続設定がある場合、テーブルに新しいレコードを挿入する ​Insert​ 操作を設定できます。

  1. Studio のフローで、​[Insert]​ 操作を選択します。

  2. コネクタ設定画面で、実行する SQL クエリを ​[SQL Query Text (SQL クエリテキスト)]​ 項目に設定します。例:

    INSERT INTO electronic(name, description, price, discount)
    VALUES ('Coffee Machine', 'Model: XYZ99. Uses small size capsules.', 120, 5)

id​ パラメーターは、データベースによって自動的に生成される自動増分キーであるため、クエリに渡されません。

Insert 操作の設定

設定 XML​ エディターでは、​<db:insert>​ 設定は次のように記述されます。

<db:insert config-ref="dbConfig">
  <db:sql>
    INSERT INTO electronic(name, description, price, discount)
    VALUES ('Coffee Machine', 'Model: XYZ99. Uses small size capsules.', 120, 5)
  </db:sql>
</db:insert>

Insert 操作の [Input Parameters (入力パラメーター)] 項目を設定する

入力パラメーターの利点を得るには、次のように同等の SQL クエリを構築します。

  1. Studio のフローで、​[Insert]​ 操作を選択します。

  2. コネクタ設定画面で、実行する SQL クエリを ​[SQL Query Text (SQL クエリテキスト)]​ 項目に設定します。例:

INSERT INTO electronic(name, description, price, discount)
VALUES (:name, :description, :price, :discount)
  1. [Input Parameters (入力パラメーター)]​ 項目で、次のパラメーターを設定します。

{
    name: 'Coffee Machine',
    description: 'Model:XYZ99. Uses small size capsules.',
    price: 120,
    discount: 5
}
「Input Parameter (入力パラメーター)」 項目の設定

設定 XML​ エディターでは、​<db:input-parameters>​ 設定は次のように記述されます。

<db:insert config-ref="dbConfig">
    <db:sql>
        INSERT INTO electronic(name, description, price, discount)
        VALUES (:name, :description, :price, :discount)
    </db:sql>
    <db:input-parameters>#[{
        name: 'Coffee Machine',
        description: 'Model:XYZ99. Uses small size capsules.',
        price: 120,
        discount: 5}]
    </db:input-parameters>
</db:insert>

Insert 操作の [Auto Generate Keys (自動生成キー)] 項目を設定する

Insert​ 操作は、2 つの項目 (クエリの影響を受けた行数を示す整数 ​affectedRows​ と、自動生成されたキーが含まれるマップ ​generatedKeys​) が含まれる ​Statement Result​ オブジェクトを出力します。

次の例の出力では、行は正常にテーブルに追加されているが、マップ ​generatedKeys​ が空であることが示されています。マップが空になるのは、オーバーヘッドを回避するためにこの情報がデフォルトで無効になっているためです。

{
  "affectedRows": 1,
  "generatedKeys": {

  }
}

情報をアクティブ化してキーを生成する手順は、次のとおりです。

  1. Studio のフローで、​[Insert]​ 操作を選択します。

  2. [Advanced (詳細)]​ タブで ​[Auto generate keys (自動生成キー)]​ 項目を ​[True]​ に設定します。

「Input Parameter (入力パラメーター)」 項目の設定

設定 XML​ エディターでは、​<autoGenerateKeys>​ 設定は次のように記述されます。

<db:insert config-ref="dbConfig" autoGenerateKeys="true">
...
</db:insert>

ステートメントで影響を受けた行ごとに複数のキーが生成される場合、目的の列名が含まれるリストを設定して、返される列を指定できます。例:

  1. Studio のフローで、​[Insert]​ 操作を選択します。

  2. [Advanced (詳細)]​ タブで、​[Auto generate column names (列名を自動生成)]​ 項目を [​Expression or Bean reference​ (式または bean 参照)] に設定して、項目を 1 つの文字列要素が含まれる DataWeave リストに設定します。

  3. [expression (式)] 項目を ​['id']​ に設定して、​id​ 列のみが返されるようにします。

「Auto generate column names (列名を自動生成)」 項目の設定

設定 XML​ エディターでは、​<autoGeneratedKeysColumnNames>​ 設定は次のように記述されます。

<db:insert config-ref="dbConfig" autoGenerateKeys="true" autoGeneratedKeysColumnNames="#[['id']]">
    ...
</db:insert>

Studio で Update 操作を設定する

electronic​ テーブルが事前に定義されている場合、テーブルのデータを更新する (たとえば、価格値が 100 を越えているすべての項目の割引を 10 % に設定する) には、次のように ​Update​ 操作を設定します。

  1. Studio のフローで、​[Update]​ 操作を選択します。

  2. コネクタ設定画面で、​"UPDATE electronic SET discount = :discount WHERE price > :price"​ のように、実行する SQL クエリを ​[SQL Query Text (SQL クエリテキスト)]​ 項目に設定します。

  3. [Input parameters (入力パラメーター)]​ 項目を次のパラメーターに設定します。

{
      discount: 10,
      price: 100
}
Update 操作の設定

設定 XML​ エディターでは、​<db:update>​ 設定は次のように記述されます。

<db:update doc:name="Update">
			<db:sql ><![CDATA["UPDATE electronic SET discount = :discount WHERE price > :price"]]></db:sql>
			<db:input-parameters ><![CDATA[#[{
        discount: 10,
        price: 100
    }]]]></db:input-parameters>
		</db:update>

<![CDATA[…​]]>​ ラッパーにより、クエリで ​>​ や ​"​ などの特殊文字を使用できます。 ラッパーがない場合、これらの文字の XML でエスケープされたバージョン (​&gt;​ や ​&quot;​ など) を使用する必要があります。

Studio で Delete 操作を設定する

electronic​ テーブルが事前に定義されている場合、​id: 1​ のレコードを削除するには、次のように ​Delete​ 操作を設定します。

  1. Studio のフローで、​[Update]​ 操作を選択します。

  2. コネクタ設定画面で、​DELETE FROM electronic WHERE id = :id​ のように、実行する SQL クエリを ​[SQL Query Text (SQL クエリテキスト)]​ 項目に設定します。

  3. [Input parameters (入力パラメーター)]​ 項目を ​{id: 1}​ に設定します。

Studio での Update 操作の設定

設定 XML​ エディターでは、​<db:delete>​ 設定は次のように記述されます。

<db:delete config-ref="dbConfig">
    <db:sql>DELETE FROM electronic WHERE id = :id</db:sql>
    <db:input-parameters>#[{
        id: 1
    }]</db:input-parameters>
</db:delete>

レコード挿入 Mule アプリケーションの例

次の例は、データベースに個人のレコードを作成するように ​Insert​ 操作を設定する方法を示しています。

  1. Studio で、HTTP ​Listener​ ソースを Studio キャンバスにドラッグします。

  2. [Path (パス)]​ を ​/person​ に設定します。

  3. [Insert]​ 操作を ​[Listener]​ ソースの横にドラッグします。

  4. [Connector configuration (コネクタ設定)]​ 項目の横にあるプラス記号 (​+​) をクリックし、グローバル要素設定項目にアクセスします。

  5. [SQL Query Text (SQL クエリテキスト)]​ ボックスで、次の SQL テキストを宣言します。

    insert into person (id, name, photo, dob)
    values (:ID,:NAME,:PHOTO,:DOB);
  1. [Input Parameters (入力パラメーター)]​ 項目で、作成する個人レコードのマップのリストを指定します。これには、パラメーター名がキーとして、値がパラメーターとして含まれます。また、すべてのリスト項目は挿入する行を表します。

    {'ID' : message.payload.parts['id'].content ,
    'NAME': message.payload.parts['name'].content,
    'PHOTO' : message.payload.parts['photo'].content,
    'DOB' : message.payload.parts['dob'].content}
  2. [Set Payload]​ コンポーネントを ​[Insert]​ 操作の横にドラッグ横にます。

  3. [Value (値)]​ を ​Person Created​ (個人作成済み) に設定します。

  4. Mule アプリケーションを保存して実行します。

設定 XML​ エディターでは、設定は次のように記述されます。

<?xml version="1.0" encoding="UTF-8"?>

<mule xmlns:db="http://www.mulesoft.org/schema/mule/db" xmlns:http="http://www.mulesoft.org/schema/mule/http"
	xmlns="http://www.mulesoft.org/schema/mule/core"
	xmlns:doc="http://www.mulesoft.org/schema/mule/documentation" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd
http://www.mulesoft.org/schema/mule/http http://www.mulesoft.org/schema/mule/http/current/mule-http.xsd
http://www.mulesoft.org/schema/mule/db http://www.mulesoft.org/schema/mule/db/current/mule-db.xsd">
	<http:listener-config name="HTTP_Listener_config" doc:name="HTTP Listener config" >
		<http:listener-connection host="0.0.0.0" port="8081" />
	</http:listener-config>
	<db:config name="Database_Config" doc:name="Database Config" >
		<db:my-sql-connection host="localhost" port="3306" user="root" password="root" database="dev" />
	</db:config>
	<flow name="db-connector-testFlow">
		<http:listener doc:name="Listener" config-ref="HTTP_Listener_config" path="/person" allowedMethods="POST"/>
		<db:insert doc:name="Insert" config-ref="Database_Config">
			<db:sql ><![CDATA[insert into person (id, name, photo, dob)
values (:ID,:NAME,:PHOTO,:DOB);]]></db:sql>
			<db:input-parameters ><![CDATA[#[{'ID' : message.payload.parts['id'].content ,
'NAME': message.payload.parts['name'].content,
'PHOTO' : message.payload.parts['photo'].content,
'DOB' : message.payload.parts['dob'].content}]]]></db:input-parameters>
		</db:insert>
		<set-payload value="Person Created" doc:name="Set Payload" />
	</flow>
</mule>