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

 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存储到数据库中的更多相关文章

  1. java接口对接——别人调用我们接口获取数据

    java接口对接——别人调用我们接口获取数据,我们需要在我们系统中开发几个接口,给对方接口规范文档,包括访问我们的接口地址,以及入参名称和格式,还有我们的返回的状态的情况, 接口代码: package ...

  2. 从api接口获取数据-okhttp

    首先先介绍下api接口: API:应用程序接口(API:Application Program Interface) 通常用于数据连接,调用函数提供功能等等... 从api接口获取数据有四种方式:Ht ...

  3. 豆瓣爬虫——通过json接口获取数据

    最近在复习resqusts 爬虫模块,就重新写了一个豆瓣爬虫,这个网页从HTML 源码上来看是没有任何我想要的信息的,如下图所示: 这是网页视图,我在源码中查找影片信息,没有任何信息,如图: 由此我判 ...

  4. Java实现购物车功能:方式一:存放在session中.方式二:存储在数据库中

    //将购物车产品加入到cookie中,方式同浏览记录.Java实现购物车,方式一(简易版):存储在session中.这种方式实现还不严谨,大家看的时候看思路即可.(1). JSP页面中,选择某一款产品 ...

  5. SQL把表中的数据复制到另一个数据库中

    1 删除整张表的数据,并还原自增长值TRUNCATE TABLE TbWeixinActivity 2 3张表左连接select a.ID,c.Name,b.nickname,a.CreateDate ...

  6. 使用jdbc将mysql数据库中的内容封装为指定对象的list集合

    使用jdbc将mysql数据库中的内容封装为指定对象的list集合 public List<User> findAll() { private JdbcTemplate template ...

  7. 利用ajax获取网页表单数据,并存储到数据库之一(使用JDBC)

    所谓JDBC就是利用java与数据库相连接的技术,从数据库获取既有的信息或者把网页上的信息存储到数据库. 这里简单的介绍公司的一个小项目中的一部分,由于代码较多,所以用图片形式进行展示.源码请查看源码 ...

  8. 调用REST接口获取数据

    /// <summary> /// 根据机构代码本机构下报警用户列表: /// </summary> /// <param name="org_code&quo ...

  9. java通过免费接口获取ip地址的服务商信息

    今天分享一个免费在线的小工具的开发代码就是通过淘宝提供的接口获取服务商信息,工具地址:http://www.yzcopen.com/seo/ipadress 代码如下: public class Yz ...

随机推荐

  1. 一次框架性能的比较,引起了我对搭建web框架的兴趣

    背景 一次无意的访问,点击到了一个专门做PHP性能测试的网站,看这里PHP Benchmarks. 在里面发现了框架性能测试的结果,发现Laravel的框架性能尽然是最低的.瞬间受到了一万点的暴击,谁 ...

  2. 一篇文章带你解读Redis分布式锁的发展史和正确实现方式

    前言 近两年来微服务变得越来越热门,越来越多的应用部署在分布式环境中,在分布式环境中,数据一致性是一直以来需要关注并且去解决的问题,分布式锁也就成为了一种广泛使用的技术,常用的分布式实现方式为Redi ...

  3. JS基础知识——原型与原型链

    1.如何准确判断一个变量的数组类型 2.写一个原型链继承的例子 3.描述new一个对象的过程 4.zepto(或其他框架中如何使用原型链) 知识点: (1)构造函数 function Foo(name ...

  4. 一起学MyBatis之入门篇(2)

    概述 本文主要讲解MyBatis中类型转换的功能,其实在MyBatis中,提供了默认的数据类型之间的转换,但只是基本数据类型的转换,如果跨类型进行转换,则需要自定义转换类,如java中是boolean ...

  5. Day01-基础数据类型/用户交互/流程控制之-if

    1.基础数据类型 什么是数据类型 我们人类可以很容易的分清数字与字符的区别,但是计算机并不能,计算机虽然很强大,但从某种角度上看又很傻,除非你明确的告诉它,1是数字,“汉”是文字,否则它是分不清1和‘ ...

  6. 全字段多条件搜索(api接口)

    近期在做项目时遇到了一个全表全字段多条件搜索的需求,在平时搜索最常见的就是 字段+like +‘% 条件%’这种模式,但遇到多条件多字段时,这种就不适用了. 表字段已知,条件未知,条件数量未知,这种情 ...

  7. WPF 3D足球导览

    根据博文:https://www.cnblogs.com/duel/p/regular3dpoints.html获取足球的3D坐标后,在每一个坐标位置创建一个ModelVisual3D元素,既能实现炫 ...

  8. 如何给div、p添加onload事件?

    前提 其实只有 <body>.<frame>.<iframe>.<img>.<link>.<script>.<style& ...

  9. ORACLE spool打印

    问题描述:spool让我想起来了spooling假脱机,但是这个spool是oracle下的命令,将select查询出来的数据打印出来 1.linuxi下 spool +路径+文件名,这里的文件如果不 ...

  10. Linux-IO监控

    系统级IO监控 iostat 先进行安装 yum install -y sysstat iostat [ options ] [ <interval> [ <count> ] ...