今天同事给我一个接口,让我实现将远程的数据的信息通过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的方式实现数据的远程获取,并且将数据插入到数据库的表当中,并且数据当中的数据不断进行插入操作。