java实现从一个数据库导入数据到另外一个数据库以及将大量图片导入到数据库中jdbc实现方法

需求背景
在某地客户现场,遇到一个需求,将一个数据库中的某个表的数据导入到另外一台服务器上的数据库,并且表中包含blob字段,在使用kettle失败的情况下,shell脚本咱又不熟悉,作为一个java程序猿,紧急使用java的jdbc实现处理此业务,当然程序还是有很多可以完善的地方,此例子比较适合新人练手学习。
第一个类:将数据从一个库导出写入另外一个库
这里假定有数据库A和B,某个表包含Blob字段,我的实现思路为:将A库中的表a数据通过JDBC查出,后将数据插入到数据库B中的表b,将A中的blob字段取出,还原为图片文件保存到本地,我这么做是为了再写一个类,专门将图片数据导入数据库,经过我的测试,直接将Blob以及表数据插入到另外一个库速度方面会比较慢。
下面是我的实现代码,数据库为Oracle数据库:

package com.zhangb;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

import oracle.jdbc.driver.OracleConnection;
import oracle.sql.BLOB;
import oracle.sql.CLOB;

/**
 * import data from one database to another
 * 
 * @author 
 * @version 
 */
class ExportDataByJdbc {
	
	public static OutputStream outStream = null;
	
	public static void main(String[] args) throws Exception {
		Connection con = null;// 创建一个数据库连接
		PreparedStatement pre = null;// 创建预编译语句对象,一般都是用这个而不用Statement
		ResultSet result = null;// 创建一个结果集对象
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");// 加载Oracle驱动程序
			System.out.println("开始尝试连接cms数据库!");
			String url = "jdbc:oracle:" + "thin:@192.168.166.53:1521:ORCL";
			String user = "root";// 用户名,系统默认的账户名
			String password = "root";// 你安装时选设置的密码
			con = DriverManager.getConnection(url, user, password);// 获取连接
			System.out.println("cms连接成功!");
			String sql = "SELECT SFZH,XM,ZP,D_RKSJ FROM T_EXP_ZP";// 预编译语句,“?”代表参数
			pre = con.prepareStatement(sql);// 实例化预编译语句
			result = pre.executeQuery();// 执行查询,注意括号中不需要再加参数
			ExportData(result);
		} 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("cms数据库连接已关闭!");
			} catch (Exception e) {
				e.printStackTrace();
			}
		}

	}

	public static String ExportData(ResultSet result) {

		Connection con = null;// 创建一个数据库连接
		PreparedStatement pre = null;
		PreparedStatement updatePre = null;// 创建预编译语句对象,一般都是用这个而不用Statement
		ResultSet result2 = null;// 创建一个结果集对象
		Timestamp currentTime = new Timestamp(System.currentTimeMillis());
		SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		String dateString = formatter.format(currentTime);
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");// 加载Oracle驱动程序
			System.out.println("开始尝试连接omp数据库!");
			String url = "jdbc:oracle:" + "thin:@192.168.166.55:1521:orcl";
			String user = "root";// 用户名,系统默认的账户名
			String password = "123";// 你安装时选设置的密码
			con = DriverManager.getConnection(url, user, password);// 获取连接
			System.out.println("omp连接成功!");
			int num = 0;
			List<String> idList = new ArrayList<String>();
			
			while (result.next()) {
				String sfzh = result.getString("SFZH");
				if(sfzh == null || idList.contains(sfzh)){
					continue;
				}
				idList.add(sfzh);
				con.setAutoCommit(false);
				String sql = "insert into t_exp_zp1(SFZH,XM,D_RKSJ,ZP)"
						+ " values(?,?,?,empty_blob())";
				pre = con.prepareStatement(sql);
				pre.setString(1, sfzh);
				pre.setString(2, result.getString("XM"));
				pre.setString(3, result.getString("D_RKSJ"));
				pre.executeUpdate();
				pre.close();
				num = num + 1;
				
				System.out.println("插入成功第" + (num) + "条数据");
				java.sql.Blob data = result.getBlob("ZP");
				if(data == null){
					continue;
				}
				InputStream ins = data.getBinaryStream();
				
				byte [] bytes = new byte[(int)data.length()];
				ins.read(bytes);
				ins.close();
				String fileName = result.getString("SFZH")+".jpeg";
				String path =System.getProperty("user.dir").replace("\\", "/")+"/pic/";
				File file = new File(path+fileName);
				File pathFile = new File(path);
				if(!pathFile.exists()){
					pathFile.mkdir();
				}
				if(!file.exists()){
					file.createNewFile();
				}
				FileOutputStream fo = new FileOutputStream(file);
				fo.write(bytes);
				fo.close();
				con.commit();
				con.setAutoCommit(true);
				System.out.println("第" + (num) + "条数据更新图片");
				
			}

		} 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("omp数据库连接已关闭!");
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		return null;

	}
}

第二个类:将规则命名图片以Blob形式插入到表中
实现思路,先获取图片名称,通过sql找到在库中属于哪一条,然后将此图片转化为Blob字段存储,其实数据库中直接存储Blob会很占用存储资源,一般我们会将图片保存在图片服务器,数据库中保存对应的记录即可。
下面是我的实现代码:

package com.zhangb;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
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.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

import oracle.jdbc.driver.OracleConnection;
import oracle.sql.BLOB;
import oracle.sql.CLOB;

/**
 * import data from one database to another
 * 
 * @author 
 * @version 
 */
public class ImportPicDataByJdbc {
	
	public static OutputStream outStream = null;
	
	public static void main(String[] args) throws Exception {
		Connection con = null;// 创建一个数据库连接
		ResultSet result = null;// 创建一个结果集对象
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");// 加载Oracle驱动程序
			System.out.println("开始尝试连接omp数据库!");
			String url = "jdbc:oracle:" + "thin:@192.168.166.55:1521:orcl";
			String user = "root";// 用户名,系统默认的账户名
			String password = "123";// 你安装时选设置的密码
			con = DriverManager.getConnection(url, user, password);// 获取连接
			System.out.println("omp连接成功!");
			ImportPicData(con);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				// 逐一将上面的几个对象关闭,因为不关闭的话会影响性能、并且占用资源
				// 注意关闭的顺序,最后使用的最先关闭
				if (result != null)
					result.close();
				if (con != null)
					con.close();
				System.out.println("cms数据库连接已关闭!");
			} catch (Exception e) {
				e.printStackTrace();
			}
		}

	}

	public static void ImportPicData(Connection con) {
			String path =System.getProperty("user.dir").replace("\\", "/")+"/pic/";
			File file = new File(path);
			int num = 0;
			PreparedStatement pre = null;// 创建预编译语句对象,一般都是用这个而不用Statement
			try {
				File [] fileList = file.listFiles();
				for(File subFile : fileList){
					String fileName = subFile.getName();
					String sfzh = fileName.substring(0,fileName.indexOf("."));
					String sql = "SELECT ZP FROM t_exp_zp1 where SFZH=? for update";
					pre = con.prepareStatement(sql);
					pre.setString(1, sfzh);
					ResultSet result = pre.executeQuery();// 执行查询,注意括号中不需要再加参数
					BLOB blob = null;
					if(result.next()){
						blob=(BLOB)result.getBlob("ZP");
					}
					File pic = new File(path+fileName);
					FileInputStream fin = new FileInputStream(pic);
					byte[] data = new byte[fin.available()];
					fin.read(data);
					OutputStream os = blob.getBinaryOutputStream();
					os.write(data);
					fin.close();
					os.close();	
					con.commit();
					result.close();
					pre.close();
					num = num + 1;
					System.out.println("第" + (num) + "条数据更新图片");
				}
					
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
			if (pre != null){
				try {
					pre.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			
		}

	}

	
}

创作不易,如果文章对你有所帮助,请为博主点个赞吧!

你可能感兴趣的:(JAVA基础和应用)