实现数据库的数据迁移

实现数据库的数据迁移

使用场景

在系统二次开发完成时需要将老版本系统的数据移植到新的系统(新老系统存在差异比如数据库字段多少的问题,如果不存在就推荐移库,但大多数系统是存在差异的,如果在数据库或新系统界面添加不仅繁琐而且很容易出错,在此基础上有必要写个程序来快速,高效,正确的移植数据)。以上便是我写篇博客的目的。

思路

第一步:将老数据库的数据读取出来放到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包
需要的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需要注意这点)。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值