通过http实现调接口,实现将远程的数据库数据插入到本地的数据当中的操作。

今天同事给我一个接口,让我实现将远程的数据的信息通过http的形式获取到插入到本地的数据库当中。

(1)简单的方法是通过ajax传递参数,然后在后台请求数据。

(2)通过http请求获取到数据,然后插入到插入到本地的数据库当中。

实现思路(第一种也可以但是如果使用第一种的话,就需要和页面进行交互,最后选择了第二中方式)

(1)通过写http获取值。

(2)解析json格式的数据

(3)然后连接数据库实现数据的插入操作。

业务代码如下:


package com.message.transfer;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.URL;


import com.message.transfer.po.Order;
import com.message.transfer.util.Jdbcdemo;


import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

public class TranferMain {
/**
* 调用对方接口方法
* @param path 对方或第三方提供的路径
* @param data 向对方或第三方发送的数据,大多数情况下给对方发送JSON数据让对方解析
*/
public static void interfaceUtil(String path,String data) {
try {
URL url = new URL(path);
//打开和url之间的连接
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
PrintWriter out = null;
//请求方式
conn.setRequestMethod("POST");
String encoding = "UTF-8";
conn.setRequestProperty("Content-Type", "application/json; charset=" + encoding);
//设置通用的请求属性
conn.setRequestProperty("accept", "*/*");
conn.setRequestProperty("connection", "Keep-Alive");
conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");
//设置是否向httpUrlConnection输出,设置是否从httpUrlConnection读入,此外发送post请求必须设置这两个
//最常用的Http请求无非是get和post,get请求可以获取静态页面,也可以把参数放在URL字串后面,传递给servlet,
//post与get的 不同之处在于post的参数不是放在URL字串里面,而是放在http请求的正文内。
conn.setDoOutput(true);
conn.setDoInput(true);
//获取URLConnection对象对应的输出流
out = new PrintWriter(conn.getOutputStream());
out.write(data);
//发送请求参数即数据
// out.print(data);
//缓冲数据
out.flush();
//获取URLConnection对象对应的输入流
InputStream is = conn.getInputStream();
//构造一个字符流缓存
BufferedReader br = new BufferedReader(new InputStreamReader(is));
//这里设置缓冲流,如果用String的话性能降低。
StringBuffer bf = new StringBuffer();
String line = null;
while ((line = br.readLine()) != null) {
/*这里获取到的是一个String的字符串,然后解析json,然后建一个实体类。然后set进去
* 然后使用JDBC插入到数据库当中。
* */
bf.append(line);
}
//得到的全部的json数据。
String str = bf.toString();
//将字符串数据转换为json对象
JSONObject jsonObject = JSONObject.fromObject(str);
String dataStr= jsonObject.get("data").toString();
JSONObject datajsonObject = JSONObject.fromObject(dataStr);
String strList = datajsonObject.get("billList").toString();
//这里将字符串转化为json的对象数组。
JSONArray jsonArray=JSONArray.fromObject(strList);
for(int i=0;i<jsonArray.size();i++){
// 遍历对象数组,然后将数组中属性为billDtlList的对象拿出来。
JSONObject job = jsonArray.getJSONObject(i);
String billDtlStr = job.get("billDtlList").toString();
//billDtlList是一个对象数组,将字符串转化为对象数组,
JSONArray jsonArrayBillDtlStr=JSONArray.fromObject(billDtlStr);
for(int j=0;j<jsonArrayBillDtlStr.size();j++){
JSONObject dtljob = jsonArrayBillDtlStr.getJSONObject(j);
//将实体类的值放到对象的对应的属性当中去。
Order stu=(Order)JSONObject.toBean(dtljob, Order.class);
//将对象插入数据库。
Jdbcdemo.insert(stu);
}
}
//关闭流
is.close();
//断开连接,最好写上,disconnect是在底层tcp socket链接空闲时才切断。如果正在被其他线程使用就不切断。
//固定多线程的话,如果不disconnect,链接会增多,直到收发不出信息。写上disconnect后正常一些。
conn.disconnect();
System.out.println("完整结束");
} catch (Exception e) {
e.printStackTrace();
}
}

public static void main(String[] args) {
String sendData = "{\"code\":\"101475\",\"billCode\":\"\",\"startTime\":\"2018-8-1 24:00:00\",\"endTime\":\"2018-8-2 24:00:00\"}";
interfaceUtil("URL地址", sendData);

}
}

 实体类Oder自己可以使用工具自动生成;

下面是关于连接数据库,实现数据的插入操作的相关代码:

package com.message.transfer.util;

import java.sql.DriverManager;
import java.sql.SQLException;

import com.message.transfer.po.Order;
import com.mysql.jdbc.Connection;
import com.mysql.jdbc.PreparedStatement;

public class Jdbcdemo {

    private static Connection getConn() {
        String driver = "com.mysql.jdbc.Driver";
        String url = "jdbc:mysql://172.31.40.228:3306/test";
        String username = "root";
        String password = "password";
        Connection conn = null;
        try {
            Class.forName(driver); // classLoader,加载对应驱动
            conn = (Connection) DriverManager.getConnection(url, username,
                    password);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return conn;
    }
    
    public static void insert(Order stu) {
        Connection conn = getConn();
        PreparedStatement ps = null;
        String sql = "INSERT INTO orderInfo (id, billId, dishId, comboId, dishCode, dishName, dishUnit, dishPrice,"
                + "normPrice, dishNum, dishAmount, realAmount, dishAttribute, operAttribute, reasId, reasName,"
                + "orderPerson, userAccount, userName, operTime, isServing, servTime, exActAmount, singAmount) "
                + "values('"+ stu.getId() + "','" + stu.getBillId() + "','" + stu.getDishId()
                + "','" + stu.getComboId()+ "','" + stu.getDishCode()+ "','" + stu.getDishName()+ "','" + stu.getDishUnit()
                + "','" + stu.getDishPrice()+ "','" + stu.getNormPrice()+ "','" + stu.getDishNum()+ "','" + stu.getDishAmount()
                + "','" + stu.getRealAmount()+ "','" + stu.getDishAttribute()+ "','" + stu.getOperAttribute()
                + "','" + stu.getReasId()+ "','" + stu.getReasName()+ "','" + stu.getOrderPerson()+ "','" + stu.getUserAccount()
                + "','" + stu.getUserName()+ "','" + stu.getOperTime()+ "','" + stu.getIsServing()+ "','" + stu.getServTime()
                + "','" + stu.getExActAmount()+ "','" + stu.getSingAmount()+ "')";
        
        try {
            ps = (PreparedStatement) conn.prepareStatement(sql);// 把写好的sql语句传递到数据库,让数据库知道我们要干什么
            int a = ps.executeUpdate();// 这个方法用于改变数据库数据,a代表改变数据库的条数
            if (a > 0) {
                System.out.println("添加成功");
            } else {
                System.out.println("添加失败");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        try {
            if (ps != null) {
                ps.close();
            }
            if (conn != null) {
                conn.close();
            }
        } catch (Exception e2) {
            e2.printStackTrace();
        }
    }
}


至此实现了http的方式实现数据的远程获取,并且将数据插入到数据库的表当中,并且数据当中的数据不断进行插入操作。

posted on 2018-08-03 18:54  gxg123  阅读(1731)  评论(0编辑  收藏  举报

导航