2017-09-27 67 views
0

我想一次在mule数据库连接器中插入多行。任何人都可以请帮助我吗?如何在mule数据库连接器中插入多行?

我可以成功地将下面的消息作为发布请求插入到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 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> 

回答

1

阿肖克,我只是迈过这道坎,所以你像我通过这一段时间的斗争得到了真的很幸运在这里。非常令人惊讶的是,在互联网上找不到这种常见的情况。下面列出了步骤,流程也在下面。

1)使用转换将后期有效载荷转换为java列表(application/java) - 输出应该只有有效载荷(去除大括号并放置有效载荷)。这个有效载荷应该来自身体。

2)使用为每个范围,并把该数据库插入语句有

3)在数据库中插入语句用[有效载荷[“用户名”]]一种语法的指用户名的值在当前记录(或任何你有的字段名称)。我正在使用存储的产品插入,但您明白了。

我不能在这里发布流量..它切断它,显示它很奇怪。如果您可以分享,我会尽力通过电子邮件向您发送。

现在,我必须弄清楚的是,如何发送带有插入状态的好消息。任何已经完成的人..感谢您的投入!

+0

将尝试这一做法,并让你知道 –

+0

现在我能够以连续的方式发布的记录,但我没能得到我插入记录插入状态(计数)。 –

+0

我现在需要尝试一下。我相信将rowcount作为存储过程的输出参数返回并将其设置为输出有效负载应该可以工作。 –

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> 

溶液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组件

UPDATE更换记录:

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

在这里,在最后你会在记录器获取每个状态插入的行是意味着成功

要得到一个particu LAR行详细信息ouside的foreach:

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

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

+0

如何获取数据库任务后的插入状态? –

+0

插入状态是什么意思?在数据库之后放置一个记录器:'。如果数字为1或大于零以确认插入成功。 ' –

+0

如果我插入2条记录意味着,是否有机会在每个循环之外获得该值? –

1

使用批量更新模式,并通过你的连接器对象的集合插入。在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> 

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

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

+0

我选择了批量执行的操作,但在以阵列形式发送有效内容时,其不会为当前行插入取或指向索引。 values(#[payload.patient_id],#[payload。]插入到patient_symptom(patient_id,symptom_date,symptom_code_id,scale_id,value)值中。症状日期],#[payload.symptom_code_id],#[payload.scale_id],#[payload.value])

+0

你可以更具体地说明你的意思吗?为当前行插入“?它多次插入相同的行? –

+0

我选择了批量模式并发送包含对象数组的有效载荷。但是反过来它并没有得到当前索引的迭代。 –

相关问题