经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » Oracle » 查看文章
Java之通过接口获取数据并用JDBC存储到数据库中
来源:cnblogs  作者:爱懒懒的小景景  时间:2019/7/29 9:04:38  对本文有异议

最近做数据同步功能,从接口获取数据然后存到数据库中以便后续对数据进行相关操作,下面就贴一下相关代码。

  1. 1 import com.alibaba.fastjson.JSON;
  2. 2 import com.alibaba.fastjson.JSONObject;
  3. 3
  4. 4 public class Digests {
  5. 5 private static final String APPKEY = "appkey";
  6. 6 private static final String SECRET = "secret";
  7. 7 private static final String OPENAPI_IP_PORT_HTTP = "ip";
  8. 8
  9. 9 /**
  10. 10 * 分页获取数据。
  11. 11 */
  12. 12 private static final String GET_DATA = "balabala";
  13. 13
  14. 14 //md5加密
  15. 15 public static final String md5(String s) {
  16. 16 char[] hexDigits = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
  17. 17 'a', 'b', 'c', 'd', 'e', 'f' };
  18. 18 try {
  19. 19 MessageDigest mdTemp = MessageDigest.getInstance("MD5");
  20. 20 try {
  21. 21 mdTemp.update(s.getBytes("UTF-8"));
  22. 22 } catch (UnsupportedEncodingException e) {
  23. 23 mdTemp.update(s.getBytes());
  24. 24 }
  25. 25 byte[] md = mdTemp.digest();
  26. 26 int j = md.length;
  27. 27 char[] str = new char[j * 2];
  28. 28 int k = 0;
  29. 29 for (int i = 0; i < j; ++i) {
  30. 30 byte byte0 = md[i];
  31. 31 str[(k++)] = hexDigits[(byte0 >>> 4 & 0xF)];
  32. 32 str[(k++)] = hexDigits[(byte0 & 0xF)];
  33. 33 }
  34. 34 return new String(str).toUpperCase();
  35. 35 } catch (Exception e) {
  36. 36 }
  37. 37 return null;
  38. 38 }
  39. 39
  40. 40 //创建token
  41. 41 public static final String buildToken(String url, String paramJson,
  42. 42 String secret) {
  43. 43 String tempUrl = null;
  44. 44 if (url.contains("https://"))
  45. 45 tempUrl = url.substring("https://".length());
  46. 46 else {
  47. 47 tempUrl = url.substring("http://".length());
  48. 48 }
  49. 49 int index = tempUrl.indexOf("/");
  50. 50 String URI = tempUrl.substring(index);
  51. 51 String[] ss = URI.split("\\?");
  52. 52 if (ss.length > 1) {
  53. 53 return md5(ss[0] + ss[1] + secret);
  54. 54 }
  55. 55 return md5(ss[0] + paramJson + secret);
  56. 56 }
  57. 57
  58. 58 /**
  59. 59 * HTTP方式 分页获取数据。
  60. 60 */
  61. 61 public static String getData(double pageNo, Long startTime) throws Exception { //第一个参数是当前页数,第二个参数是请求数据的开始时间(为毫秒数)
  62. 62 String url = OPENAPI_IP_PORT_HTTP + GET_DATA ;
  63. 63 Map<String, Object> map = new HashMap<String, Object>();
  64. 64 JSONObject jsonObject = JSONObject.parseObject(getDefaultUserUUID());
  65. 65 String opUserUuid = jsonObject.getString("data");
  66. 66 //System.out.println(opUserUuid);
  67. 67 map.put("appkey", APPKEY);// 设置APPKEY
  68. 68 map.put("time", System.currentTimeMillis());// 设置时间参数
  69. 69 map.put("pageNo", pageNo);// 设置当前页数
  70. 70 map.put("pageSize", 1000);// 设置一页多少条
  71. 71 map.put("opUserUuid", opUserUuid);// 设置操作用户UUID
  72. 72 map.put("startTime", startTime);// 设置开始时间
  73. 73 map.put("endTime", System.currentTimeMillis());// 设置结束时间
  74. 74 String params = JSON.toJSONString(map);
  75. 75 System.out.println(" ====== getData请求参数:【" + params + "】");
  76. 76 String data = HttpClientSSLUtils.doPost(
  77. 77 url + "?token="
  78. 78 + Digests.buildToken(url + "?" + params, null, SECRET),
  79. 79 params);
  80. 80 System.out.println(" ====== getData请求返回结果:【{" + data + "}】");
  81. 81
  82. 82 return data;
  83. 83 }
  84. 84 }

 

从接口拿到数据后,下面就将数据存到数据库中:

  1. 1 import net.sf.json.JSONArray;
  2. 2 import net.sf.json.JSONObject;
  3. 3
  4. 4 public class SyncDataFn {
  5. 5
  6. 6 public int jxJson() throws Exception {
  7. 7 //此处省略数据库连接相关语句,具体见上一篇properties配置文件连接数据库
  8. 8
  9. 9 // 创建Statement用于执行SQL语句
  10. 10 connection.setAutoCommit(false);
  11. 11 stmt = connection.createStatement();
  12. 12
  13. 13 Long maxtime;
  14. 14 String sqlMaxtime = "select max(eventTime) as maxTime from data";
  15. 15 ResultSet rs1 = stmt.executeQuery(sqlMaxtime); // 查询数据库看数据是否已经存在,表示只更新没有更新进来的数据
  16. 16 if (rs1.next()) { // 该条数据存在
  17. 17 maxtime = rs1.getLong("maxTime");
  18. 18 } else {
  19. 19 maxtime = (long) 0;
  20. 20 }
  21. 21 rs1.close();
  22. 22
  23. 23 //得到json数据
  24. 24 String json = Digests.getDoorEventsHistory(1, maxtime);
  25. 25 JSONObject jsonObject = (JSONObject) JSONObject.fromObject(json);
  26. 26 String to = (String) jsonObject.getString("data");
  27. 27 JSONObject toObject = JSONObject.fromObject(to);
  28. 28 double total = Integer.parseInt(toObject.getString("total"));
  29. 29 int page = (int) Math.ceil(total / 1000);
  30. 30 for (double k = 1; k <= page; k++) {
  31. 31
  32. 32 //得到json数据
  33. 33 String jsonTemp = Digests.getData(k, maxtime);
  34. 34 String data = JSONObject.fromObject(jsonTemp).getString("data");
  35. 35 String list = JSONObject.fromObject(data).getString("list");
  36. 36 JSONArray jsonArr = JSONArray.fromObject(list);
  37. 37
  38. 38 String dataName[] = new String[jsonArr.size()];
  39. 39 String eventType[] = new String[jsonArr.size()];
  40. 40 String eventTime[] = new String[jsonArr.size()];
  41. 41 String eventName[] = new String[jsonArr.size()];
  42. 42 String cardNo[] = new String[jsonArr.size()];
  43. 43 String personId[] = new String[jsonArr.size()];
  44. 44 String personName[] = new String[jsonArr.size()];
  45. 45 String deptName[] = new String[jsonArr.size()];
  46. 46
  47. 47 for (int i = 0; i < jsonArr.size(); i++) {
  48. 48
  49. 49 dataName[i] = jsonArr.getJSONObject(i).getString("dataName");
  50. 50 eventType[i] = jsonArr.getJSONObject(i).getString("eventType");
  51. 51 eventTime[i] = jsonArr.getJSONObject(i).getString("eventTime");
  52. 52 eventName[i] = jsonArr.getJSONObject(i).getString("eventName");
  53. 53 cardNo[i] = jsonArr.getJSONObject(i).getString("cardNo");
  54. 54 personId[i] = jsonArr.getJSONObject(i).getString("personId");
  55. 55 personName[i] = jsonArr.getJSONObject(i).getString("personName");
  56. 56 deptName[i] = jsonArr.getJSONObject(i).getString("deptName");
  57. 57 //如果得到的字段有null的,做相应处理
  58. 58 cardNo[i] = (cardNo[i] == "null") ? null + "," : "'"
  59. 59 + cardNo[i] + "'";
  60. 60 personName[i] = (personName[i] == "null") ? null + "," : "'"
  61. 61 + personName[i] + "',";
  62. 62 + deptUuid[i] + "',";
  63. 63 deptName[i] = (deptName[i] == "null") ? null + "," : "'"
  64. 64 + deptName[i] + "',";
  65. 65
  66. 66 strSQL = "INSERT into door_events_history values(AUTOID_SEQ.NEXTVAL,"
  67. 67 + "'"+ dataName[i]+ "','"+ eventType[i]+ ","+ eventTime[i]+ ",'"+ eventName[i]+ "',"+ cardNo[i]+ ","+ personId[i]+ ","+ personName[i]+ deptName[i] + ")";
  68. 68
  69. 69 try {
  70. 70 String sql = "select cardNo,eventTime from data where cardNo = "
  71. 71 + cardNo[i]
  72. 72 + " and eventTime = "
  73. 73 + eventTime[i];
  74. 74 ResultSet rs = stmt.executeQuery(sql); // 查询数据库看数据是否已经存在
  75. 75 if (rs.next()) { // 该条数据已经存在
  76. 76 } else {
  77. 77 stmt.executeUpdate(strSQL);
  78. 78 count++;
  79. 79 }
  80. 80 rs.close();
  81. 81 } catch (Exception e) {
  82. 82 e.printStackTrace();
  83. 83 } finally {
  84. 84
  85. 85 }
  86. 86 }
  87. 87
  88. 88 connection.commit();
  89. 89 } // for结束
  90. 90
  91. 91 // 先关闭Statement
  92. 92 if (stmt != null)
  93. 93 try {
  94. 94 stmt.close();
  95. 95 } catch (SQLException e) {
  96. 96 e.printStackTrace();
  97. 97 }
  98. 98 // 后关闭Connection
  99. 99 if (connection != null)
  100. 100 try {
  101. 101 connection.close();
  102. 102 } catch (SQLException e) {
  103. 103 e.printStackTrace();
  104. 104 }
  105. 105 log.info("当前时间===" + new Date());
  106. 106 log.info("同步结束");
  107. 107 log.info("共更新了"+ count + "条数据");
  108. 108 return count;
  109. 109 }
  110. 110 }

 

其中AUTOID_SEQ.NEXTVAL为Oracle中的自增序列

 

 至此,数据已经同步到指定的数据库中啦,打完收工!

 

注意:拼接sql的时候一定要按照字段类型来看是否增加单引号,否则插入数据会报错。

原文链接:http://www.cnblogs.com/ailanlan/p/11250783.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号