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 数据含有 attr1attr2

笔者基于 SpringBoot + MyBatis 实现功能并给出示例代码具体步骤为

  1. 建立数据表 data_table含有字段 attr1attr2
  2. 建立 Java 类 Data含有属性 attr1attr2
  3. 编写函数 queryData() 意为获取接口数据函数以 POST 方法发起一个 JSON 请求JSON 内含 token
  4. 编写函数 clearData() 意为清空表旧数据
  5. 编写函数 writeData() 意为获取的数据转化成 Data 对象其后写入表新数据
  6. 定期执行任务

其中如果嫌麻烦可以借助 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();
	}
阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: Java数据库

“Java定期将接口数据存进数据库” 的相关文章