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

如何在mule数据库连接器中插入多行?,mule,mule-esb,Mule,Mule Esb,我想一次在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"

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

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

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

1) 使用transform将post有效负载转换为java列表(application/java)–输出应该只有有效负载(去掉大括号,只放入有效负载)。该有效载荷应来自车身

2) 用于每个作用域,并将数据库insert语句放在那里

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

我无法在这里发布流程。。它把它剪掉,让人觉得很奇怪。如果你能分享,我会尝试通过电子邮件发送给你


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

Ashok,我刚刚跨过了这道关卡,所以你在这里真的很幸运,因为我不得不挣扎了一段时间。非常令人惊讶的是,在互联网上找不到这样一个常见的场景。下面列出了这些步骤,流程也在下面

1) 使用transform将post有效负载转换为java列表(application/java)–输出应该只有有效负载(去掉大括号,只放入有效负载)。该有效载荷应来自车身

2) 用于每个作用域,并将数据库insert语句放在那里

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

我无法在这里发布流程。。它把它剪掉,让人觉得很奇怪。如果你能分享,我会尝试通过电子邮件发送给你


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

这非常简单,您可以通过两种方式完成:
解决方案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>  
<logger message="#[flowVars.myMap.get('row1').toString()]" level="INFO" doc:name="Logger"/>

在这两种情况下,您都可以看到记录器正在使用的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"/>

最后,您将在logger中看到插入的每一行的状态,即1表示成功

要获取外部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>  
<logger message="#[flowVars.myMap.get('row1').toString()]" level="INFO" doc:name="Logger"/>


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

这非常简单,您可以通过两种方式来实现:
解决方案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>  
<logger message="#[flowVars.myMap.get('row1').toString()]" level="INFO" doc:name="Logger"/>

在这两种情况下,您都可以看到记录器正在使用的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"/>

最后,您将在logger中看到插入的每一行的状态,即1表示成功

要获取外部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>  
<logger message="#[flowVars.myMap.get('row1').toString()]" level="INFO" doc:name="Logger"/>


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

使用批量更新模式,并向连接器传递一组要插入的对象。在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>

然后,列表中的每个元素将成为连接器中的
有效负载
,并将被插入。您不需要为每个或任何循环机制使用。不过,请确保传递一个iterable对象

参见相关文档:

使用批量更新模式,并将要插入的对象集合传递给连接器。在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>

然后,列表中的每个元素将成为连接器中的
有效负载
,并将被插入。您不需要为每个或任何循环机制使用。不过,请确保传递一个iterable对象

参见相关文档:

Ashok,在这里回复您关于聚合来自for each的响应的评论,因为我还不能添加评论。查看下面的链接,它提供了一些选项


Ashok,在这里回复您关于聚合来自for each的响应的评论,因为我还不能添加评论。查看下面的链接,它提供了一些选项

<