我想一次在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>
答案 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循环机制。确保传递一个可迭代的对象。
答案 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