今天寫了java原始代碼-----把別人家數據庫某個時間段的時間給同步到本地數據庫

package com.bean.freezer;
import static org.junit.Assert.fail;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.JdbcTemplate;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.bean.gnet.UUIDGenerator;
import com.common.SouthOrder;
import com.dao.recharge.RechargeDao;
import com.utils.HttpClientUtils;
import base.bean.Fbean;
import common.Logger;

/**
 * @describtion: 插入設備日用量數據工具類
 * @author robin 2020年6月23日 上午11:11:26
 * 
 */
public class FreezerGenerator {

	public static void main(String[] args) {

		// 數據手動連接6步曲
		System.out.print("數據庫手動連接");
		Connection conn = getConnection();
		Logger logger = Logger.getLogger(FreezerGenerator.class);
		List<Date> dateTime = getDateTime();
		// 1.調取用戶登錄接口
		String loginUrl = "https://yun.sinocold.net:5001/api/ExternalApi/login?account=xx&pwd=yy";
		String projectUrl = "https://yun.sinocold.net:5001/api/ExternalApi/GetPr?";
		String loginInfo = HttpClientUtils.doGet(loginUrl);
		JSONObject loginObject = JSONObject.parseObject(loginInfo);
		if (!loginObject.getString("Code").equals("200") && loginObject.getString("Message").equals("成功")) {
			System.out.println("接口調用失敗!");
		} else {
			logger.info("登錄成功,開始處理業務邏輯!");
			long startTime = System.currentTimeMillis();
			if (loginObject != null) {
				JSONObject data = loginObject.getJSONObject("Data");
				String token = data.getString("token");
				JSONArray projectData = data.getJSONArray("ProjectData");
				for (int j = 0; j < projectData.size(); j++) {
					JSONObject js = projectData.getJSONObject(j);
					String companyId = js.getString("CompanyId");
//					String companyName = js.getString("CompanyName");
					String projectId = js.getString("ProjectId");
					String realMonth=null;
					// 開關作用,定義在循環外層
					boolean flag = true;
					// 2.調用獲取項目能耗接口
					for (Date date : dateTime) { // System.out.println(new
						String day = new SimpleDateFormat("yyyy-MM-dd").format(date);
						String projectEnergyUrl = projectUrl + "companyId=" + companyId + "&projectId=" + projectId
								+ "&startDate=" + day + "&subentryId=1";// +"&Authorization=Bearer "+token
						String coolDevice = HttpClientUtils.doGetByToken(projectEnergyUrl, token);
						String month = day.substring(0, 7);// 2020-06 2020-06-22 從昨天開始
						String everyDay = day.substring(8, 10);// 22 2020-06-22 從昨天開始
						String dday = "D" + everyDay;
						System.out.println("查詢日期:" + day + "--------->" + coolDevice + "\t");
						JSONObject deviceObject = JSONObject.parseObject(coolDevice);
			          if (deviceObject.getString("Code").equals("200")&& deviceObject.getString("Message").equals("成功")) 
			             {
							JSONObject dataInfo = deviceObject.getJSONObject("Data");
							JSONObject innerData = dataInfo.getJSONObject("Data");
							JSONArray lastDeviceInfos = innerData.getJSONArray("獨立租戶");
							//第二次外層循環flag=false   ,每個循環執行 40次
		                            if(!flag) {
		                            	for (int i = 0; i < lastDeviceInfos.size(); i++) {
											JSONObject singleDevice = lastDeviceInfos.getJSONObject(i);
											String id = singleDevice.getString("Id");
											String value = singleDevice.getString("value");
												// 方法2:JVM直接跟數據庫通訊
												try {
													String sql2="update Freezer_DayNumber set "+dday+"=? where UUID=? and MON_MON=?";
			 										PreparedStatement statement2 = conn.prepareStatement(sql2);
				 									statement2.setString(1,value);
				 									statement2.setString(2,id);
				 									statement2.setString(3,month);
				 									statement2.executeUpdate();
			 										logger.info("sql語句2-------------->"+sql2);
												} catch (SQLException e) {
													logger.info("數據庫連接異常!");
													e.printStackTrace();
												}
		
								         }//for循環結尾括號
		                            	
		                            	
		                            	
		                            	//如果月份相同,則爲false
		                            }else {
		                            	// lastDeviceInfos 循環遍歷冷櫃設備信息 內層for循環執行 40次(因爲40個冷櫃設備),外層日期循環執行一次
		    							for (int i = 0; i < lastDeviceInfos.size(); i++) {
		    										JSONObject singleDevice = lastDeviceInfos.getJSONObject(i);
		    										String id = singleDevice.getString("Id");
		    										String value = singleDevice.getString("value");
		    		//								System.out.println(month+"/"+id+"/"+value+"\t");
		    		//								String name = singleDevice.getString("name");//可以不插入表
		    										// 數據庫操作 coolDevice信息,最終存入數據庫表
		    										String uuid = UUIDGenerator.generate();
		    		//								fb.setA1(id);
		    		//								fb.setA2(value);
		    		//								fb.setA3(dday);
		    		//								fb.setA4(month);
		    		//								try {
		    		//									//插入表Freezer_DayNumber信息
		    		//									rechargeDao.addFreezerDayNumber(fb);
		    		//								} catch (Exception e) {
		    		//									e.printStackTrace();
		    		//								}
		    											// 方法2:JVM直接跟數據庫通訊
		    											try {
		    												// 月份變化的時候執行插入操作
		    												String sql = "insert into Freezer_DayNumber(SY_ID,UUID,MON_MON," + dday
		    														+ ") values (?,?,?,?)";
		    												PreparedStatement statement = conn.prepareStatement(sql);
		    												statement.setString(1, uuid);
		    												statement.setString(2, id);
		    												statement.setString(3, month);
		    												statement.setString(4, value);
		    												statement.executeUpdate();
		    												logger.info("sql語句1-------------->" + sql);
		    			
		    			//										//月份和上一次循環一樣的話就執行更新操作
		    			//										String sql2="update Freezer_DayNumber set "+dday+"=? where UUID=?";
		    			//										PreparedStatement statement2 = conn.prepareStatement(sql2);
		    			//										statement2.setString(1,value);
		    			//										statement2.setString(2,id);
		    			//										statement2.executeUpdate();
		    			//										logger.info("sql語句2-------------->"+sql2);
		    			//									}else {
		    			//										//月分變化的時候執行插入操作
		    			//										String sql3="insert into Freezer_DayNumber(SY_ID,UUID,MON_MON,"+dday+") values (?,?,?,?)";
		    			//										PreparedStatement statement3 = conn.prepareStatement(sql3);
		    			//										statement3.setString(1,uuid);
		    			//										statement3.setString(2,id);
		    			//										statement3.setString(3,month);
		    			//										statement3.setString(4,value);
		    			//										statement3.executeUpdate();
		    			//										logger.info("sql語句3-------------->"+sql3);
		    			//									}
		    												/*
		    												 * 數據庫查詢語句沒問題 String sql="select * from rooms_man"; ResultSet resultSet =
		    												 * statement.executeQuery(sql); while (resultSet.next()) { String rm_id =
		    												 * resultSet.getString("rm_id"); logger.info(rm_id); }
		    												 */
		    											} catch (SQLException e) {
		    												logger.info("數據庫連接異常!");
		    												e.printStackTrace();
		    											}
		
		    							    }//for循環結尾括號
									}//else結尾    40次循環遍歷過程  結束月
//                        	 realMonth = day.substring(0, 7);
                        	//realMonth是結束月、month是開始月
							    if (everyDay.equals("01")) {
									flag = true;
								}else {
									flag =false;
								}
						}//if結尾
							try {
								System.out.println("開始睡眠了,等待10秒");
								// 接口調用不能太頻繁
								Thread.sleep(10000);
							} catch (InterruptedException e) {
								e.printStackTrace();
							}
					} //以上是雙層for循環結尾

				}
				long endTime = System.currentTimeMillis();
				logger.info("經歷了:" + (endTime - startTime) / 1000 / 60 + " 分鐘");
			}
		}
	}

	private static Connection getConnection() {
		String driverName = "com.microsoft.jdbc.sqlserver.SQLServerDriver";
		String url = "jdbc:sqlserver://localhost:1433;DatabaseName=JDY";
		String userName = "sa";
		String password = "11";
		try {
			// 1.註冊驅動
			Class.forName(driverName);
			// 2.創建連接對象
			Connection connection = DriverManager.getConnection(url, userName, password);
//					String sql = "select * from rooms_man";
			// 3-1.創建數據庫預處理對象
//					PreparedStatement psStatement = connection.prepareStatement(sql);
//					psStatement.setXxx(int index,Object val);
//					psStatement.executeQuery();
			// 3-2.創建數據庫語句對象
//					Statement statement = connection.createStatement();
			// 4.數據庫查詢
//					  statement.executeUpdate(sql);
			// 5.遍歷結果集

			// 6.關閉異常
			return connection;

		} catch (Exception e) {
			System.out.println("數據庫連接失敗!");
			e.printStackTrace();
		}
		return null;

	}

	private static List<Date> getDateTime() {
		// 存日期的數組
		List<Date> dateList = new ArrayList<Date>();
		Calendar cal = Calendar.getInstance();
		Date subTime = null;
		Date parseBeginTime = null;
		String beginTime = "2020-03-28";
		try {
			parseBeginTime = new SimpleDateFormat("yyyy-MM-dd").parse(beginTime);
		} catch (ParseException e1) {
			e1.printStackTrace();
		}
		do {
			try {
				// 獲取當前日期的對應天數
				int day = cal.get(Calendar.DAY_OF_MONTH);
				// 天數減一
				cal.set(Calendar.DAY_OF_MONTH, day - 1);
				// 獲取昨天日期
				subTime = cal.getTime();
				dateList.add(subTime);
			} catch (Exception e) {
				e.printStackTrace();
			}

		} while (!new SimpleDateFormat("yyyy-MM-dd").format(subTime)
				.equals(new SimpleDateFormat("yyyy-MM-dd").format(parseBeginTime)));

		return dateList;
	}

}

歷經15分鐘,遷移數據OK
在這裏插入圖片描述
表中數據由無變有
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章