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

时间:2017-09-27 19:19:06

标签: mule mule-esb

我想一次在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"
},
{
    "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配置文件,该文件已配置为一次插入一行。

<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 个答案:

答案 0 :(得分:2)

这非常简单,您可以通过两种方式实现:
solution1 使用拆分器:

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

solution2 使用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"/>

现在您可以使用数据库组件

替换记录器 根据评论

更新

<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 表示成功

要获得特定行详细信息,请访问:

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

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

答案 1 :(得分: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或any循环机制。确保传递一个可迭代的对象。

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

答案 2 :(得分:1)

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

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

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

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

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

现在我需要弄清楚的是如何使用插入状态发回一条好消息。任何已经做过的人......感谢你的投入!

答案 3 :(得分:1)

Ashok,回复你关于汇总每个人的回复的评论,因为我还没有添加评论。查看以下链接,其中提供了一些选项。

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