Java之通过接口获取数据并用JDBC存储到数据库中
最近做数据同步功能,从接口获取数据然后存到数据库中以便后续对数据进行相关操作,下面就贴一下相关代码。
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject; public class Digests {
private static final String APPKEY = "appkey";
private static final String SECRET = "secret";
private static final String OPENAPI_IP_PORT_HTTP = "ip"; /**
* 分页获取数据。
*/
private static final String GET_DATA = "balabala"; //md5加密
public static final String md5(String s) {
char[] hexDigits = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'a', 'b', 'c', 'd', 'e', 'f' };
try {
MessageDigest mdTemp = MessageDigest.getInstance("MD5");
try {
mdTemp.update(s.getBytes("UTF-8"));
} catch (UnsupportedEncodingException e) {
mdTemp.update(s.getBytes());
}
byte[] md = mdTemp.digest();
int j = md.length;
char[] str = new char[j * 2];
int k = 0;
for (int i = 0; i < j; ++i) {
byte byte0 = md[i];
str[(k++)] = hexDigits[(byte0 >>> 4 & 0xF)];
str[(k++)] = hexDigits[(byte0 & 0xF)];
}
return new String(str).toUpperCase();
} catch (Exception e) {
}
return null;
} //创建token
public static final String buildToken(String url, String paramJson,
String secret) {
String tempUrl = null;
if (url.contains("https://"))
tempUrl = url.substring("https://".length());
else {
tempUrl = url.substring("http://".length());
}
int index = tempUrl.indexOf("/");
String URI = tempUrl.substring(index);
String[] ss = URI.split("\\?");
if (ss.length > 1) {
return md5(ss[0] + ss[1] + secret);
}
return md5(ss[0] + paramJson + secret);
} /**
* HTTP方式 分页获取数据。
*/
public static String getData(double pageNo, Long startTime) throws Exception { //第一个参数是当前页数,第二个参数是请求数据的开始时间(为毫秒数)
String url = OPENAPI_IP_PORT_HTTP + GET_DATA ;
Map<String, Object> map = new HashMap<String, Object>();
JSONObject jsonObject = JSONObject.parseObject(getDefaultUserUUID());
String opUserUuid = jsonObject.getString("data");
//System.out.println(opUserUuid);
map.put("appkey", APPKEY);// 设置APPKEY
map.put("time", System.currentTimeMillis());// 设置时间参数
map.put("pageNo", pageNo);// 设置当前页数
map.put("pageSize", 1000);// 设置一页多少条
map.put("opUserUuid", opUserUuid);// 设置操作用户UUID
map.put("startTime", startTime);// 设置开始时间
map.put("endTime", System.currentTimeMillis());// 设置结束时间
String params = JSON.toJSONString(map);
System.out.println(" ====== getData请求参数:【" + params + "】");
String data = HttpClientSSLUtils.doPost(
url + "?token="
+ Digests.buildToken(url + "?" + params, null, SECRET),
params);
System.out.println(" ====== getData请求返回结果:【{" + data + "}】"); return data;
}
}
从接口拿到数据后,下面就将数据存到数据库中:
import net.sf.json.JSONArray;
import net.sf.json.JSONObject; public class SyncDataFn { public int jxJson() throws Exception {
//此处省略数据库连接相关语句,具体见上一篇properties配置文件连接数据库 // 创建Statement用于执行SQL语句
connection.setAutoCommit(false);
stmt = connection.createStatement(); Long maxtime;
String sqlMaxtime = "select max(eventTime) as maxTime from data";
ResultSet rs1 = stmt.executeQuery(sqlMaxtime); // 查询数据库看数据是否已经存在,表示只更新没有更新进来的数据
if (rs1.next()) { // 该条数据存在
maxtime = rs1.getLong("maxTime");
} else {
maxtime = (long) 0;
}
rs1.close(); //得到json数据
String json = Digests.getDoorEventsHistory(1, maxtime);
JSONObject jsonObject = (JSONObject) JSONObject.fromObject(json);
String to = (String) jsonObject.getString("data");
JSONObject toObject = JSONObject.fromObject(to);
double total = Integer.parseInt(toObject.getString("total"));
int page = (int) Math.ceil(total / 1000);
for (double k = 1; k <= page; k++) { //得到json数据
String jsonTemp = Digests.getData(k, maxtime);
String data = JSONObject.fromObject(jsonTemp).getString("data");
String list = JSONObject.fromObject(data).getString("list");
JSONArray jsonArr = JSONArray.fromObject(list); String dataName[] = new String[jsonArr.size()];
String eventType[] = new String[jsonArr.size()];
String eventTime[] = new String[jsonArr.size()];
String eventName[] = new String[jsonArr.size()];
String cardNo[] = new String[jsonArr.size()];
String personId[] = new String[jsonArr.size()];
String personName[] = new String[jsonArr.size()];
String deptName[] = new String[jsonArr.size()]; for (int i = 0; i < jsonArr.size(); i++) { dataName[i] = jsonArr.getJSONObject(i).getString("dataName");
eventType[i] = jsonArr.getJSONObject(i).getString("eventType");
eventTime[i] = jsonArr.getJSONObject(i).getString("eventTime");
eventName[i] = jsonArr.getJSONObject(i).getString("eventName");
cardNo[i] = jsonArr.getJSONObject(i).getString("cardNo");
personId[i] = jsonArr.getJSONObject(i).getString("personId");
personName[i] = jsonArr.getJSONObject(i).getString("personName");
deptName[i] = jsonArr.getJSONObject(i).getString("deptName");
//如果得到的字段有null的,做相应处理
cardNo[i] = (cardNo[i] == "null") ? null + "," : "'"
+ cardNo[i] + "'";
personName[i] = (personName[i] == "null") ? null + "," : "'"
+ personName[i] + "',";
+ deptUuid[i] + "',";
deptName[i] = (deptName[i] == "null") ? null + "," : "'"
+ deptName[i] + "',"; strSQL = "INSERT into door_events_history values(AUTOID_SEQ.NEXTVAL,"
+ "'"+ dataName[i]+ "','"+ eventType[i]+ ","+ eventTime[i]+ ",'"+ eventName[i]+ "',"+ cardNo[i]+ ","+ personId[i]+ ","+ personName[i]+ deptName[i] + ")"; try {
String sql = "select cardNo,eventTime from data where cardNo = "
+ cardNo[i]
+ " and eventTime = "
+ eventTime[i];
ResultSet rs = stmt.executeQuery(sql); // 查询数据库看数据是否已经存在
if (rs.next()) { // 该条数据已经存在
} else {
stmt.executeUpdate(strSQL);
count++;
}
rs.close();
} catch (Exception e) {
e.printStackTrace();
} finally { }
} connection.commit();
} // for结束 // 先关闭Statement
if (stmt != null)
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
// 后关闭Connection
if (connection != null)
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
log.info("当前时间===" + new Date());
log.info("同步结束");
log.info("共更新了"+ count + "条数据");
return count;
}
}
其中AUTOID_SEQ.NEXTVAL为Oracle中的自增序列
至此,数据已经同步到指定的数据库中啦,打完收工!
注意:拼接sql的时候一定要按照字段类型来看是否增加单引号,否则插入数据会报错。
Java之通过接口获取数据并用JDBC存储到数据库中的更多相关文章
- java接口对接——别人调用我们接口获取数据
java接口对接——别人调用我们接口获取数据,我们需要在我们系统中开发几个接口,给对方接口规范文档,包括访问我们的接口地址,以及入参名称和格式,还有我们的返回的状态的情况, 接口代码: package ...
- 从api接口获取数据-okhttp
首先先介绍下api接口: API:应用程序接口(API:Application Program Interface) 通常用于数据连接,调用函数提供功能等等... 从api接口获取数据有四种方式:Ht ...
- 豆瓣爬虫——通过json接口获取数据
最近在复习resqusts 爬虫模块,就重新写了一个豆瓣爬虫,这个网页从HTML 源码上来看是没有任何我想要的信息的,如下图所示: 这是网页视图,我在源码中查找影片信息,没有任何信息,如图: 由此我判 ...
- Java实现购物车功能:方式一:存放在session中.方式二:存储在数据库中
//将购物车产品加入到cookie中,方式同浏览记录.Java实现购物车,方式一(简易版):存储在session中.这种方式实现还不严谨,大家看的时候看思路即可.(1). JSP页面中,选择某一款产品 ...
- SQL把表中的数据复制到另一个数据库中
1 删除整张表的数据,并还原自增长值TRUNCATE TABLE TbWeixinActivity 2 3张表左连接select a.ID,c.Name,b.nickname,a.CreateDate ...
- 使用jdbc将mysql数据库中的内容封装为指定对象的list集合
使用jdbc将mysql数据库中的内容封装为指定对象的list集合 public List<User> findAll() { private JdbcTemplate template ...
- 利用ajax获取网页表单数据,并存储到数据库之一(使用JDBC)
所谓JDBC就是利用java与数据库相连接的技术,从数据库获取既有的信息或者把网页上的信息存储到数据库. 这里简单的介绍公司的一个小项目中的一部分,由于代码较多,所以用图片形式进行展示.源码请查看源码 ...
- 调用REST接口获取数据
/// <summary> /// 根据机构代码本机构下报警用户列表: /// </summary> /// <param name="org_code&quo ...
- java通过免费接口获取ip地址的服务商信息
今天分享一个免费在线的小工具的开发代码就是通过淘宝提供的接口获取服务商信息,工具地址:http://www.yzcopen.com/seo/ipadress 代码如下: public class Yz ...
随机推荐
- Java工作流系统jflow向工作处理器传值的方法大全
关键词:工作流快速开发平台 工作流流设计 业务流程管理 asp.net 开源工作流 bpm工作流系统 java工作流主流框架 自定义工作流引擎 表单设计器 流程设计器 在启动开始节点时, ...
- 简单学习【1】——打包JS
webpack entry <entry> output webpack --config webpack.conf.js Step1:新建一个文件,里面有一个app.js 一个sum.j ...
- SQLHelper.cs类 微软C#版
using System; using System.Data; using System.Xml; using System.Data.SqlClient; using System.Collect ...
- html5 websocket 示例,websocket在线聊天,php websocket实例
WebSocket在线测试工具 http://ws.douqq.com/ 1.连接格式为 ws://IP/域名:端口(示例ws://119.29.3.36:5354) 2.对于内网的测试环境,只需填入 ...
- 面试连环炮系列(十五):说说Eureka的高可用方案
说说Eureka的高可用方案 至少3个Eureka实例才能满足高可用,配置方法如下: 准备三个节点node1,node2,node3. 在每个实例的application.xml文件里加入 eurek ...
- 准确率、精确率、召回率、F-Measure、ROC、AUC
先理解一下正类(Positive)和负类(Negetive),比如现在要预测用户是否点击了某个广告链接,点击了才是我们要的结果,这时,点击了则表示为正类,没点击则表示为负类. TP(True Posi ...
- Oracle Proc编程性能优化经验
Proc 是Oracle提供的一种数据库操作的API.它是基于ESql技术的,需要预编译后才可以变成普通c代码,非常不直观,使用起来不太方便,阅读也存在困难. 因为这些问题导致程序员平时开发中会出现一 ...
- 深入理解 Spring Cloud 核心组件与底层原理
一.Spring Cloud核心组件:Eureka Netflix Eureka Eureka详解 1.服务提供者 2.服务消费者 3.服务注册中心 二.Spring Cloud核心组件:Ribbon ...
- Android 框架布局 FrameLayout
<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android=" ...
- WSL2(预览版)体验笔记
WSL2安装 WSL2在今年5月份Microsoft Build大会上发布了,但至今Windows10一直没收到更新推送,我想这么久过去就算没进入正式,至少也到了RC版了吧,于是开始折腾准备体验一把. ...