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 ...
随机推荐
- web漏洞-命令执行、文件上传、XSS
一.命令执行 1:什么是命令执行? 命令执行漏洞是指攻击者可以随意执行系统命令.属于高危漏洞之一任何脚本语言都可以调用操作系统命令. 应用有时需要调用一些执行系统命令的函数,举个例子如:PHP中的 ...
- python学习-excel读取
# 第三方库 openpyxl # install 安装# pip install openpyxl # 引入第三方库# excel操作的流程:# 打开excel,进入工作薄 workbook# 选择 ...
- Vue ---- vue的基本使用 文本/事件/属性指令 补充: js面向对象 js函数
目录 日考题(知识点)
- 细解JavaScript ES7 ES8 ES9 新特性
题记:本文提供了一个在线PPT版本,方便您浏览 细解JAVASCRIPT ES7 ES8 ES9 新特性 在线PPT ver 本文的大部分内容译自作者Axel Rauschmayer博士的网站,想了解 ...
- 《Java基础知识》Java instanceof 运算符
java多态性带来一个问题,就是如何判断一个变量所实际引用对象的类型.这里java帮我们引入了 instanceof 运算符. instanceof运算符用来判断一个变量的所引用对象的实际类型,注意是 ...
- ElasticSearch 时间格式
"datetime": { "type": "date", "format": "yyyy-MM-dd HH: ...
- Dubbo简介与基本概念
场景 分布式系统的发展演变以及RPC简介: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/103555049 Dubbo简介 Ap ...
- AI: Web: 1 Vulnhub Walkthrough
下载链接: https://www.vulnhub.com/entry/ai-web-1,353/ 主机发现扫描: 主机端口扫描 http://10.10.202.158/ 目录扫描: ╰─ sudo ...
- [20191218]降序索引疑问4.txt
[20191218]降序索引疑问4.txt --//前几天优化一个项目,我发现许多表里面有有隐含字段,一般开发很少建立函数索引.我自己检查发现里面存在大量的降序索引.--//我感觉有点奇怪,为什么开发 ...
- Appium(九):Appium API(三) 滑动和拖拽、高级手势、手机操作
1. 滑动和拖拽 我们在做自动化测试的时候,有些按钮是需要滑动几次屏幕后才会出现,此时,我们需要使用代码来模拟手指的滑动,也就是接下来要学的滑动和拖拽了. 1.1 swipe滑动事件 从一个坐标位置滑 ...