天天看點

實作資料庫的資料遷移

實作資料庫的資料遷移

    • 使用場景
    • 思路

使用場景

在系統二次開發完成時需要将老版本系統的資料移植到新的系統(新老系統存在差異比如資料庫字段多少的問題,如果不存在就推薦移庫,但大多數系統是存在差異的,如果在資料庫或新系統界面添加不僅繁瑣而且很容易出錯,在此基礎上有必要寫個程式來快速,高效,正确的移植資料)。以上便是我寫篇部落格的目的。

思路

第一步:将老資料庫的資料讀取出來放到json檔案中(json數組的形式),json可以很友善通過自定的字段名稱取得其值。

第二步:通過讀取json檔案方式可以快速準确的寫如資料庫。

package com.main;

import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.text.SimpleDateFormat;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

public class JsonFile {

	public static void main(String[] args) {
		testOracle();
	}
	public static void testOracle()
	{
	    Connection con = null;// 建立一個資料庫連接配接
	    PreparedStatement pre = null;// 建立預編譯語句對象,一般都是用這個而不用Statement
	    ResultSet result = null;// 建立一個結果集對象
	    PrintWriter pw = null;
	    try
	    {                  
	        Class.forName("oracle.jdbc.driver.OracleDriver");// 加載Oracle驅動程式
	        System.out.println("開始嘗試連接配接資料庫!");
	        String url = "jdbc:oracle:" + "thin:@192.168.0.155:1521:orcl";// 127.0.0.1是本機位址,XE是精簡版Oracle的預設資料庫名
	        String user = "radiodb";// 使用者名,系統預設的賬戶名
	        String password = "radiodb";// 你安裝時選設定的密碼
	        con = DriverManager.getConnection(url, user, password);// 擷取連接配接
	        System.out.println("連接配接成功!");
	        String sql = "select * from radioinfo t";// 預編譯語句,“?”代表參數
	        pre = con.prepareStatement(sql);// 執行個體化預編譯語句
	        result = pre.executeQuery();// 執行查詢,注意括号中不需要再加參數
	        String filename = "sql.json";
			//建構json數組,數組裡面也是json
			JSONArray arrayPlayer = new JSONArray();
			SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
	        while (result.next()){
                //建構json數組中的對象
				JSONObject player1 = new JSONObject();
				player1.put("RADIONAME", result.getString("RADIONAME"));
				player1.put("RADIOCODE", result.getString("RADIOCODE"));
				player1.put("RADIOSENSOR", result.getInt("RADIOSENSOR"));
				player1.put("DELFLAG", result.getInt("DELFLAG"));
				player1.put("STOREID", result.getString("STOREID"));
				player1.put("TEAMID", result.getString("TEAMID"));
				player1.put("CREATETIME", format.format(result.getDate("CREATETIME")));
				player1.put("RADIOSTATUS", result.getInt("RADIOSTATUS"));
				player1.put("RADIOTYPE", result.getInt("RADIOTYPE"));
				player1.put("RADIOTAG", result.getInt("RADIOTAG"));
				player1.put("RADIOPHONE", result.getString("RADIOPHONE"));
				player1.put("HOLEID", result.getString("HOLEID"));
				player1.put("STOREID", result.getString("STOREID"));
				player1.put("RADIONUCLIDE", result.getString("RADIONUCLIDE"));
				player1.put("RADIOLABEL", result.getString("RADIOLABEL"));
				player1.put("RADIOORIGIN", result.getString("RADIOORIGIN"));
				player1.put("RADIOINTENSITY", result.getString("RADIOINTENSITY"));
				player1.put("RADIOMANUFACTURE", result.getString("RADIOMANUFACTURE"));
				player1.put("RADIOCOMMISSIONING", result.getString("RADIOCOMMISSIONING"));
				player1.put("RADIODEPOSITORY", result.getString("RADIODEPOSITORY"));
				player1.put("RADIORECORD", result.getString("RADIORECORD"));
				player1.put("RADIONUMBER", result.getInt("RADIONUMBER"));
				player1.put("RADIOACTIVITY", result.getInt("RADIOACTIVITY"));
				player1.put("RADIOHOLE", result.getInt("RADIOHOLE"));
				player1.put("RADIOUNIT", result.getString("RADIOUNIT"));
				player1.put("ACTIVITY", result.getLong("ACTIVITY"));
				player1.put("SINCE", result.getString("SINCE"));
				player1.put("RADIOCATEGORY", result.getString("RADIOCATEGORY"));
				player1.put("RADIOSTATUSINFO", result.getString("RADIOSTATUSINFO"));
				//将json對象添加到數組中
				arrayPlayer.add(player1);
	        }
	        System.out.println("生成json檔案完成!!");
	        	File file = new File(filename);
	                if(!file.exists()){
	                    // 判斷檔案不存在就new新檔案,寫資料
	                    try {
	                        file.createNewFile();
	                        // java IO流和檔案關聯
	                        pw = new PrintWriter(file);
	                        pw.print(arrayPlayer.toString());
	                        pw.flush();
	                    } catch (IOException e) {
	                        // TODO Auto-generated catch block
	                        e.printStackTrace();
	                    }
	                }
	    } catch (Exception e)
		    {
		        e.printStackTrace();
		    }
	    finally
	    {
	        try
	        {
	            // 逐一将上面的幾個對象關閉,因為不關閉的話會影響性能、并且占用資源
	            // 注意關閉的順序,最後使用的最先關閉
	            if (result != null)
	                result.close();
	            if (pre != null)
	                pre.close();
	            if (con != null)
	                con.close();
	            System.out.println("資料庫連接配接已關閉!");
	        }
	        catch (Exception e)
	        {
	            e.printStackTrace();
	        }
	    }
	}
}

           

上面需要注意幾點:

1.我是用的oracle資料庫是以具體的資料庫驅動要看你是要移植的是什麼資料庫裡面的資料。

2.需要引入對應的包如:資料庫驅動包,jsonObject 的jar包

實作資料庫的資料遷移

第二步

package com.main;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.sql.Connection;

import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Iterator;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

public class Snippet {
	public static void main(String[] args){
		new Snippet();
		String JsonContext = Snippet.ReadFile("D:/Users/Administrator/eclipse-workspace/Test6/sql.json");
		JSONArray jsonArray = JSONArray.fromObject(JsonContext);
		insertOracle(jsonArray);
	}
	@SuppressWarnings("resource")
	private static void insertOracle(JSONArray jsonArray) {
		Connection con  = null;
		PreparedStatement pre = null;
		ResultSet resultSet =null;
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			System.out.println("開始嘗試連接配接資料庫!");
			String url = "jdbc:oracle:thin:@192.168.0.155:1521:orcl";// 127.0.0.1是本機位址,XE是精簡版Oracle的預設資料庫名
	        String user = "testradio";// 使用者名,系統預設的賬戶名
	        String password = "testradio";// 你安裝時選設定的密碼
	        con =DriverManager.getConnection(url, user, password);
	        System.out.println("連接配接成功!");
	        for(int  i = 0; i < jsonArray.size(); i++){
	        	JSONObject jsonObject = jsonArray.getJSONObject(i);
		        String sql = "select * from person t where t.id=?";// 預編譯語句,“?”代表參數
		        pre = con.prepareStatement(sql);
		        String id = (String) jsonObject.get("id");
		        pre.setString(1,id);
		        String sqlString=null;
		        SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd");
		        resultSet = pre.executeQuery();
		    		if(resultSet.next()){
		    			sqlString = "update person t set t.name = ?,t.age=?,t.height=?,t.birthday=? where t.id = ? ";
		    			pre = con.prepareStatement(sqlString);
		    			pre.setString(1, (String) jsonObject.get("name"));
		    			pre.setInt(2, (int) jsonObject.get("age"));
		    			pre.setDouble(3, Double.parseDouble(jsonObject.get("height").toString()));
		    			pre.setDate(4,new java.sql.Date((format.parse(jsonObject.get("birthday").toString())).getTime()));
		    			pre.setString(5,  (String) jsonObject.get("id"));
		    			pre.executeUpdate();
		    			con.commit();
		    		}else{
		    			sqlString = "insert into person (ID,NAME,AGE,HEIGHT,BIRTHDAY) values(?,?,?,?,?)";
		    			pre = con.prepareStatement(sqlString);
		    			pre.setString(1,  (String) jsonObject.get("id"));
		    			pre.setString(2, (String) jsonObject.get("name"));
		    			pre.setInt(3, (int) jsonObject.get("age"));
		    			pre.setDouble(4,Double.parseDouble(jsonObject.get("height").toString()));
		    			pre.setDate(5, new java.sql.Date((format.parse(jsonObject.get("birthday").toString())).getTime()));
		    			pre.executeUpdate();
		    		}
	    	}
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			try
	        {
	            // 逐一将上面的幾個對象關閉,因為不關閉的話會影響性能、并且占用資源
	            // 注意關閉的順序,最後使用的最先關閉
	            if (resultSet != null)
	                resultSet.close();
	            if (pre != null)
	                pre.close();
	            if (con != null)
	                con.close();
	            System.out.println("資料庫連接配接已關閉!");
	        }
	        catch (Exception e)
	        {
	            e.printStackTrace();
	        }
		}
	}
	public static String ReadFile(String Path){
		BufferedReader reader = null;
		String laststr = "";
		try{
			FileInputStream fileInputStream = new FileInputStream(Path);
			InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream, "GBK");
			reader = new BufferedReader(inputStreamReader);
			String tempString = null;
			while((tempString = reader.readLine()) != null){
			laststr += tempString;
		}
			reader.close();
		}catch(IOException e){
			e.printStackTrace();
		}finally{
			if(reader != null){
				try {
				reader.close();
				} catch (IOException e) {
				e.printStackTrace();
				}
			}
		}
		return laststr;
		}
}


           

以上代碼需要幾點注意:

1.setDouble一般讀取有小數的整數時必須注意,一般是以double資料讀出來的,是以如果資料庫是float這需要裝換成float調用一個方法轉換成float,float轉double。

float f = 1.2f;
double d = Double.parseDouble(String.valueOf(f)) ;
           

2.setDate在設定時間時隻用日期沒有時分秒,如果享有時分秒則用setTimestamp來存入時間。

3.setDate讀取的是javal.util.Date而存入資料庫是java.sql.Date是以需要轉換日期類型(其他資料庫不知道,oracle需要注意這點)。

繼續閱讀