如何在 mule 数据库连接器中插入多行?

how to insert multiple rows in mule database connector?

我想一次在 mule 数据库连接器中插入多行。谁能帮我解决这个问题?

我可以成功地将以下消息作为 post 请求插入 mule 流。

{
    "patient_todo_id" : "2",
    "comment_date" : "2017-09-20 14:41:16",
    "comment_text" : "send me the steps to check the Pulse rate"
} 

如何将以下 post 消息插入 mule 流中的数据库?

[{
    "patient_todo_id" : "2",
    "comment_date" : "2017-09-20 14:41:16",
    "comment_text" : "send me the steps to check the Pulse rate"
},
{
    "patient_todo_id" : "2",
    "comment_date" : "2017-09-20 14:41:16",
    "comment_text" : "send me the steps to check the Pulse rate"
}]

请找到下面的 mule 流配置文件,该文件已配置为一次插入一行。

<flow name="carrotcube-patient-todo-commentFlow">
        <http:listener config-ref="HTTP_Listener_Configuration" path="${http.path.mrs.todo.comment}" doc:name="HTTP"/>
        <set-variable variableName="variable" value="#[payload]" mimeType="application/json" doc:name="Variable"/>
        <json:json-to-object-transformer returnClass="java.lang.Object" doc:name="JSON to Object"/>
        <logger message="#[payload.comment_text]" level="INFO" doc:name="Logger"/>
        <db:insert config-ref="MySQL_Configuration" doc:name="Database">
            <db:parameterized-query><![CDATA[insert into patient_todo_detail(patient_todo_id,comment_date,comment_text) values (#[payload.patient_todo_id],#[payload.comment_date],#[payload.comment_text])]]></db:parameterized-query>
        </db:insert>
</flow>

A​​shok,我刚刚跨过这个障碍,所以你在这里真的很幸运,因为我不得不挣扎了一段时间。非常令人惊讶的是,在互联网上找不到这样一个常见的场景。步骤如下,流程如下。

1) 使用 transform 将 post payload 转换为 java 列表 (application/java) – 输出应该只有 payload(去掉花括号,只放 payload)。这个payload应该来自body。

2) 用于每个范围并将数据库插入语句放在那里

3) 在数据库插入语句中使用[payload['username']] 种语法来引用当前记录中用户名的值(或您拥有的任何字段名称)。我正在使用存储产品插入,但你明白了。

我无法post这里的流程..它正在切断它并显示它很奇怪。如果你可以分享,我会尝试通过电子邮件发送给你。

现在我要弄清楚的是如何发送一条包含插入状态的好消息。任何已经这样做的人..感谢您的投入!

这非常简单,您可以通过两种方式完成:
解决方案 1 使用拆分器:

 <flow name="testFlow">
        <http:listener config-ref="HTTP_Listener_Configuration" path="/test" doc:name="HTTP"/>
        <json:json-to-object-transformer returnClass="java.lang.Object" doc:name="JSON to Object"/>
        <collection-splitter doc:name="Collection Splitter"/>
        <logger message="insert into patient_todo_detail(patient_todo_id,comment_date,comment_text) values (#[payload.patient_todo_id],#[payload.comment_date],#[payload.comment_text])" level="INFO" doc:name="Logger"/>
        <collection-aggregator failOnTimeout="true" doc:name="Collection Aggregator"/> 
        <json:object-to-json-transformer doc:name="Object to JSON"/>
  </flow>

解决方案 2 使用 foreach:

  <flow name="testFlow">
        <http:listener config-ref="HTTP_Listener_Configuration" path="/test" doc:name="HTTP"/>
        <json:json-to-object-transformer returnClass="java.lang.Object" doc:name="JSON to Object"/>
        <foreach doc:name="For Each" collection="#[payload]">
           <logger message="insert into patient_todo_detail(patient_todo_id,comment_date,comment_text) values (#[payload.patient_todo_id],#[payload.comment_date],#[payload.comment_text])" level="INFO" doc:name="Logger"/>
        </foreach>
        <json:object-to-json-transformer doc:name="Object to JSON"/> 
     </flow>  

在这两种情况下,您都可以看到您的记录器在您使用的 SQL 语句中获取正确的值:

 <logger message="insert into patient_todo_detail(patient_todo_id,comment_date,comment_text) values (#[payload.patient_todo_id],#[payload.comment_date],#[payload.comment_text])" level="INFO" doc:name="Logger"/>

现在您可以用 DB 组件替换记录器

更新 基于评论:

<set-variable variableName="myMap" value="#[new java.util.HashMap()]" doc:name="Variable"/>
 <foreach doc:name="For Each" collection="#[payload]">
     <db:insert config-ref="MySQL_Configuration" doc:name="Database">
        <db:parameterized-query><![CDATA[insert into patient_todo_detail(patient_todo_id,comment_date,comment_text) values (#[payload.patient_todo_id],#[payload.comment_date],#[payload.comment_text])]]></db:parameterized-query>
      </db:insert>
 <expression-component doc:name="Expression"><![CDATA[flowVars.myMap.put('row'+flowVars.counter,payload)]]></expression-component>
 </foreach>
   <logger message="Final status #[flowVars.myMap.toString()]" level="INFO" doc:name="Logger"/>

最后,您将在记录器中获得插入的每一行的状态,1 表示成功

要在 foreach 之外获取特定行的详细信息:

<logger message="#[flowVars.myMap.get('row1').toString()]" level="INFO" doc:name="Logger"/>

因此,您可以根据状态进一步显示您的自定义状态消息

使用批量更新模式并将要插入的对象集合传递给连接器。在 Studio 中,只需选中数据库连接器的 基本设置 部分中的 "Bulk mode"。您在问题中提供的示例数组很好,然后您可以执行以下操作:

<db:insert config-ref="MySQL_Configuration" bulkMode="true" doc:name="Database">
        <db:parameterized-query><![CDATA[
            INSERT INTO mytable(id, name)
            VALUES (#[payload.id], #[payload.name]);]]>
        </db:parameterized-query>
    </db:insert>

列表中的每个元素将成为连接器中的 payload 并被插入。您不需要使用 for-each 或任何循环机制。确保传递一个可迭代对象。

查看相关文档: https://docs.mulesoft.com/mule-user-guide/v/3.8/database-connector#setting-up-database-connector-operation

Ashok,在此处回复您关于汇总每个人的回复的评论,因为我还不能添加评论。查看以下 link,其中提供了一些选项。

https://forums.mulesoft.com/questions/60273/save-of-for-each-database-query-response-to-a-new.html