0

I want to insert multiple rows in mule database connector at a time. Could anyone kindly please help me on this?.

I can successfully insert the below message as a post request to a mule flow.

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

How to insert the below post message into a database in a mule flow?

[{
    "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"
}]

Please find the below mule flow configuration file which has been configured to insert a single row at a time.

<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>
4

4 回答 4

2

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

<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

于 2017-09-29T08:49:22.060 回答
2

这非常简单,您可以通过 2 种方式来实现:使用拆分器 的
解决方案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>

使用foreach的 解决方案2:

  <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"/>

现在您可以用您的数据库组件替换记录器

根据评论 更新:

<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"/>

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

于 2017-09-28T18:44:11.580 回答
1

Ashok,回复您关于在此处汇总来自 for each 的回复的评论,因为我还不能添加评论。查看以下链接,它提供了一些选项。

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

于 2017-09-29T14:41:16.540 回答
1

Ashok,我刚刚跨过了这个障碍,所以你在这里真的很幸运,因为我不得不挣扎了一段时间。非常令人惊讶的是,在 Internet 上找不到这种常见的情况。下面列出了步骤,流程也在下面。

1) 使用转换将 post 有效负载转换为 java 列表 (application/java) - 输出应该只有有效负载(删除花括号并放置有效负载)。这个有效载荷应该来自正文。

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

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

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

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

于 2017-09-27T22:43:17.593 回答