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

 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. js prop方法

    添加和删除属性 $("button").click(function(){ var $x = $("div"); <!--添加属性--> $x.pr ...

  2. 表删除时 Cannot delete or update a parent row: a foreign key constraint fails 异常处理

    有两张表,结构如下: t_item:                          t_bid: id        int                     id        int n ...

  3. Python之工作方向

    "python基础-->(函数/面向对象/网络编程(scoket套接字)/并发编程(mutiprocessing)) "运维+web开发-->页面展示(django/f ...

  4. 一个我经常用到的采集网页数据抓取网页获取数据的PHP函数类

    class get_c_str { var $str; var $start_str; var $end_str; var $start_pos; var $end_pos; var $c_str_l ...

  5. [ASP.NET Core 3框架揭秘] 跨平台开发体验: Linux

    如果想体验Linux环境下开发.NET Core应用,我们有多种选择.一种就是在一台物理机上安装原生的Linux,我们可以根据自身的喜好选择某种Linux Distribution,目前来说像RHEL ...

  6. Android 中 MessageQueue 的 nativePollOnce

    Android SDK 中的事件循环已经是一个老生常谈的问题了, 像 Handler Looper MessageQueue 这几个类也是被大家研究透彻了. 但是再回头看以前自己的分析, 总感觉差点什 ...

  7. Android 布局阴影实现

    最近项目要求,ui有很多有关于阴影的设计要求,网上找了些实现方式,但都不是很理想.现在闲下来了,就寻思着自己写个阴影布局耍耍,以备后用.先说道说道我找到的几种阴影实现方式: 系统阴影 Andorid ...

  8. 简单实用的git命令

    1.下载项目 先进入目录然后使用jit $ git clone +"url" 2.项目配置 $ composer install 3.上传项目 $ git add . () $ g ...

  9. 【30天自制操作系统】day05:结构体、文字显示与 GDT/IDT 初始化

    输出一个 16 行 8 列的点阵字符 void putfont8(char *vram, int xsize, int x, int y, char c, char *font) { int i; c ...

  10. 牛客集训 湖南省赛E题 Grid 动态开点线段树

    国庆牛客集训的题,正好准备好好训练线段树,想起来就补一下. 题意很简单,两种操作行合并或者列合并,每个操作后计算有多少个子块. 这题应该先推导公式,行操作或者列操作只有一种的时候,很简单,总数就是n* ...