如何在Mule中将json数据动态插入数据库

时间:2017-02-13 13:15:56

标签: java json mule anypoint-studio

嗨我有一个json文件如下,

JSON:

[
    {
        "name": "Steve",
        "salary": "$1000",
        "age": "26"
    },
    {
        "name': "Laura",
        "salary': "$1500",
        "age": "28"
    },
    {
        "name': "Jack",
        "salary": "$2000",
        "age": "30"
    }
]

我还有一个数据库表调用员工,它有三列名称,年龄和薪水。在这里,我想处理Json数据并将其存储到Employee表中。那我怎么能在骡子那样做呢?

4 个答案:

答案 0 :(得分:3)

首先,您的json请求无效,您需要在json密钥中添加 " 而不是 ' 。所以,有效的json将是: -

[
    {
        "name": "Steve",
        "salary": "$1000",
        "age": "26"
    },
    {
        "name": "Laura",
        "salary": "$1500",
        "age": "28"
    },
    {
        "name": "Jack",
        "salary": "$2000",
        "age": "30"
    }
]   

您需要从浏览器的POSTMAN客户端传递请求: -

enter image description here

现在,您可以使用以下Mule流程插入数据库: -

<http:listener-config name="HTTP_Listener_Configuration" host="0.0.0.0" port="8081" doc:name="HTTP Listener Configuration"></http:listener-config>

    <flow name="Flow"> 
        <http:listener config-ref="HTTP_Listener_Configuration" path="/set" doc:name="HTTP"></http:listener>  
        <json:json-to-object-transformer returnClass="java.util.List" doc:name="JSON to Object"></json:json-to-object-transformer>  
        <foreach collection="#[message.payload]" doc:name="For Each">
            <db:insert config-ref="Generic_Database_Configuration" doc:name="Database">
                <db:parameterized-query><![CDATA[INSERT into table1 (NAME, SALARY, AGE) VALUES (#[message.payload.name],#[message.payload.salary],#[message.payload.age]);]]></db:parameterized-query>
            </db:insert>
        </foreach>  
       <set-payload value="Inserted" doc:name="Set Payload"/>  
    </flow>

请记住设计数据库表格,当你传递薪水年龄 字符串

"salary": "$1000",
"age": "26"  

字符串此处

答案 1 :(得分:2)

首先,你在这里提供的JSON数据无效,如Anirban所说,并确保整数数据值(即年龄)不要用双引号包装。

您也可以使用Dataweave转换器,因为大多数mule开发人员更喜欢这种转换mule消息而不是json-to-object转换器。显然,json-to-object变换器也能正常工作,但Dataweave大部分开发人员现在都在使用它。

Config xml文件如下: -

<?xml version="1.0" encoding="UTF-8"?>

<mule xmlns:metadata="http://www.mulesoft.org/schema/mule/metadata" xmlns:dw="http://www.mulesoft.org/schema/mule/ee/dw"
    xmlns:db="http://www.mulesoft.org/schema/mule/db"
    xmlns:http="http://www.mulesoft.org/schema/mule/http"
    xmlns="http://www.mulesoft.org/schema/mule/core" xmlns:doc="http://www.mulesoft.org/schema/mule/documentation"
    xmlns:spring="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.mulesoft.org/schema/mule/ee/dw http://www.mulesoft.org/schema/mule/ee/dw/current/dw.xsd
http://www.mulesoft.org/schema/mule/db http://www.mulesoft.org/schema/mule/db/current/mule-db.xsd
http://www.mulesoft.org/schema/mule/http http://www.mulesoft.org/schema/mule/http/current/mule-http.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-current.xsd
http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd">

    <http:listener-config name="HTTP_Listener_Configuration" host="0.0.0.0" port="8081" connectionIdleTimeout="3000000" doc:name="HTTP Listener Configuration"/>
    <db:mysql-config name="MySQL_Configuration" host="localhost" port="3306" database="provide your schema/database name here" doc:name="MySQL Configuration" password="provide username here" user="provide password here"/>


    <flow name="muleFlow">
        <http:listener config-ref="HTTP_Listener_Configuration" path="/postEmp" allowedMethods="POST" doc:name="HTTP"/>
        <dw:transform-message metadata:id="35bfe913-8de7-4b3c-9ba9-98f375a2873e" doc:name="Transform Message">
            <dw:input-payload mimeType="application/json"/>
            <dw:set-payload><![CDATA[%dw 1.0
%output application/java
---
payload map ((payload01 , indexOfPayload01) -> {
    id: payload01.id,
    name: payload01.name,
    designation: payload01.designation,
    salary: payload01.Salary
})]]></dw:set-payload>
        </dw:transform-message>
        <foreach doc:name="For Each">
            <db:insert config-ref="MySQL_Configuration" doc:name="Database-Insert">
                <db:parameterized-query><![CDATA[insert into fulltime_employee values (#[payload.id], #[payload.name], #[payload.designation], #[payload.salary])]]></db:parameterized-query>
            </db:insert>
        </foreach>
    </flow>

</mule>

使用Transform消息转换器时,它会询问源和目标元数据。这里的源元数据将是json列表,目标元数据将是map列表。要设置源元数据,只需单击添加源部分的元数据蓝色链接,将打开一个新的弹出窗口,然后通过单击绿色加符号添加新的元数据并给出一个名称并将其类型设置为JSON并设置示例从下面的下拉列表中浏览你的json文件,它会自动填充元数据道具。对于目标元数据,选择MAP作为类型,并通过单击下面的框中的绿色符号添加名称,工资和年龄道具。记住此属性名称应与您提到的db列名称相同。

答案 2 :(得分:1)

像这样......

  
      
  1. 将您的数据设置为有效负载
  2.   
  3. 将json转换为对象列表
  4.   
  5. 使用for
  6. 循环它们   
  7. 将每个对象保存到DB
  8.   

有关详细信息,请参阅mule文档例如:https://docs.mulesoft.com/mule-user-guide/v/3.7/native-support-for-json

    <flow name="testFlow">

        <!--set json data as payload>
        <json:json-to-object-transformer returnClass="java.util.List" doc:name="JSON to Object"/>
         <!--loop list-->
       <!-- save each record-->
        <jdbc:query key="insert"
                value="INSERT INTO ${db.env}.YOUR_TABLE  (COLUMN1, COLUMN2) 
                VALUES (#[message.payload.getName()] , #[message.payload.getSurname()] )" />
    </flow>

答案 3 :(得分:1)

通过以下方式创建您的骡子流:

  1. 文件连接器 - 您将在其中阅读JSON格式文件
  2. 将有效负载放入forEach
  3. 循环通过有效负载并提取每条记录
  4. 逐个将数据插入表格。