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 ...
随机推荐
- Win32_PhysicalMedia 硬盘 参数说明
Caption 物理内存还虚拟内存 Description 描述和Caption一样 InstallDate 安装日期(无值) Name 名字 Status 状态 CreationClassName ...
- Weed3 for java 新的微型ORM框架
Weed3,微型ORM框架(支持:java sql,xml sql,annotation sql:存储过程:事务:缓存:监听:等...) 05年时开发了第一代: 08年时开发了第二代,那时候进入互联网 ...
- drf源码分析系列---认证
认证的使用 from rest_framework.authentication import BaseAuthentication from api import models # 认证类 clas ...
- [从今天开始修炼数据结构]图的最短路径 —— 迪杰斯特拉算法和弗洛伊德算法的详解与Java实现
在网图和非网图中,最短路径的含义不同.非网图中边上没有权值,所谓的最短路径,其实就是两顶点之间经过的边数最少的路径:而对于网图来说,最短路径,是指两顶点之间经过的边上权值之和最少的路径,我们称路径上第 ...
- 四步实现在一台电脑上使用多个github账号
四步实现在一台电脑上同时使用多个GitHub账号 今天和大家聊一下如何在一台电脑上同时使用多个GitHub账号,通过以下四个步骤就可以实现,其中第二个步骤为了便于叙述分成了几个小步骤. 1. 取消全局 ...
- jTopo HTML5 Canvas 画图组件
jTopo是什么? jTopo(Javascript Topology library)是一款完全基于HTML5 Canvas的关系.拓扑图形化界面开发工具包. jTopo关注于数据的图形展示,它是面 ...
- ImportError: No module named flask 导包失败,Python3重新安装Flask模块
在部署环境过程中,通过pip install -r requirements.txt安装包,结果启动项目时总是报错,显示没有flask模块,通过pip install flask还是不行,于是下载fl ...
- 编译安装基于 fastcgi 模式的多虚拟主机的wordpress和discuz的LAMP架构
目录 实现CentOS 7 编译安装基于 fastcgi 模式的多虚拟主机的wordpress和discuz的LAMP架构 准备环境: 准备软件版本: 主机名修改用以区分 数据库服务器 实现数据库二进 ...
- numpy的基本API(四)——拼接、拆分、添加、删除
numpy的基本拼接.拆分.添加.删除API iwehdio的博客园:https://www.cnblogs.com/iwehdio/ 1.np.concatenate((a, b), axis=0) ...
- IT兄弟连 HTML5教程 CSS3属性特效 自定义文字
字体使用是网页设计中不可或缺的一部分.经常地,我们希望在网页中使用某一特定字体,但是该字体并非主流操作系统的内置字体,这样用户在浏览页面的时候就有可能看不到真实的设计.美工设计师最常做的办法是把想要的 ...