Java定期将接口数据存进数据库
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
首先需要先学会用 Java 获取接口数据可以查看该篇文章
💬相关
博客《Java发起HTTP的JSON请求并解析JSON返回数据》
https://blog.csdn.net/weixin_42077074/article/details/128672130
笔者希望将一个接口的数据定期存进数据表以下给出一个示例场景
- 需向接口发起内含
token
的 JSON 请求 - 接口返回的 JSON 数据含有
attr1
和attr2
笔者基于 SpringBoot + MyBatis 实现功能并给出示例代码具体步骤为
- 建立数据表
data_table
含有字段attr1
和attr2
- 建立 Java 类
Data
含有属性attr1
和attr2
- 编写函数
queryData()
意为获取接口数据函数以 POST 方法发起一个 JSON 请求JSON 内含token
- 编写函数
clearData()
意为清空表旧数据 - 编写函数
writeData()
意为获取的数据转化成Data
对象其后写入表新数据 - 定期执行任务
其中如果嫌麻烦可以借助 Python 根据 JSON 快速生成生成 Java 类代码和数据库建表 SQL 语句可以查看该篇文章
💬相关
博客《用Python根据JSON生成Java类代码和数据库建表SQL语句》
https://blog.csdn.net/weixin_42077074/article/details/128672026
建立数据表
CREATE TABLE data_table (
attr1 varchar(255) DEFAULT NULL,
attr2 varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
建立 Java 类
public class Data {
private String attr1;
private String attr2;
public Data(
String attr1,
String attr2
) {
this.attr1=attr1;
this.attr2=attr2;
}
public Data(Data data) {
this.attr1=data.getAttr1();
this.attr2=data.getAttr2();
}
public String getAttr1() {
return attr1;
}
public String getAttr2() {
return attr2;
}
public void setAttr1(String attr1) {
this.attr1=attr1;
}
public void setAttr2(String attr2) {
this.attr2=attr2;
}
@Override
public String toString() {
return
"Data["
+ "attr1=" + attr1 +", "
+ "attr2=" + attr2
+ "]";
}
}
获取接口数据
Service 层中 Java 函数 queryData()
public String queryData(String strUrl, String token, String method) throws Exception {
URL url = new URL(strUrl);
HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
//method 为 "GET" 或 "POST"
httpConn.setRequestMethod(method);
// 设置接收内容类型
httpConn.setRequestProperty("Accept","application/json");
// 设置发送内容类型
httpConn.setRequestProperty("Content-Type","application/json;charset=UTF-8");
// 设置字符集
httpConn.setRequestProperty("charset", "UTF-8");
// 请求时是否使用缓存
httpConn.setUseCaches(false);
// POST请求必须设置下面两项
// 设置是否从 HttpUrlConnection 的对象写
httpConn.setDoOutput(true);
// 设置是否从 HttpUrlConnection 的对象读入
httpConn.setDoInput(true);
JSONObject requestJson = new JSONObject();
requestJson.put("token", token);
//发送请求
OutputStream out = new DataOutputStream(httpConn.getOutputStream());
// getBytes() 作用为根据参数给定的编码方式将一个字符串转化为一个字节数组
out.write(requestJson.toJSONString().getBytes("UTF-8"));
out.flush();
// httpConn.connect();
BufferedReader reader = new BufferedReader(new InputStreamReader(httpConn.getInputStream()));
// 循环读取流
String line;
StringBuffer buffer = new StringBuffer();
while ((line = reader.readLine()) != null) {
buffer.append(line);
}
reader.close();
httpConn.disconnect();
String res = buffer.toString();
return res;
}
清空表旧数据
Service 层中 Java 函数 clearData()
public void clearData(){
mapper.clearData();
return ;
}
Mapper 层中 Java 函数 clearData()
public void clearData();
MyBatis 中的 mapper.xml
内容
<update id="clearData">
TRUNCATE TABLE data_table
</update>
写入表新数据
Service 层中 Java 函数 writeData()
public void writeData() throws Exception {
String jsonStr = queryData();
clearData();
JSONArray jsonInfo = JSONObject.parseArray(jsonStr);//将jsonObj解析成json数组
for (int i = 0; i < jsonInfo.size(); i++) {//遍历
JSONObject jsonDetailInfo = jsonInfo.getJSONObject(i);//根据下标以此拿数据每一个数据又是一个JSONObject对象所以用JSONObject接收
mapper.writeData(new Data(
jsonDetailInfo.getString("attr1"),
jsonDetailInfo.getString("attr2")
));
}
return ;
}
Mapper 层中 Java 函数 writeData()
public void writeData(Data data);
MyBatis 中的 mapper.xml
内容
<insert id="writeData" parameterType="Data">
INSERT INTO data_table(attr1,attr2)
VALUES(#{attr1},#{attr2})
</insert>
定期执行任务
Service 层中 Java 函数 writeDataPeriodically()
public void writeDataPeriodically(long secondPeriod) throws InterruptedException {
Timer timer = new Timer();
TimerTask timerTask = new TimerTask() {
@Override
public void run() {
try {
writeData();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
};
// 第一次任务延迟时间
long delay = 2000;
// 任务执行频率(secondPeriod 单位为秒period 单位为毫秒)
long period = secondPeriod * 1000;
// 开始调度
timer.schedule(timerTask, delay, period);
// 指定首次运行时间
// timer.schedule(timerTask, DateUtils.addSeconds(new Date(), 5), period);
// 在某段时间内让任务按频率执行此后结束进程Long.MAX_VALUE 可以近似理解为只要不受外力结束进程就永久按频率执行
Thread.sleep(Long.MAX_VALUE);
// 终止并移除任务
timer.cancel();
timer.purge();
}