需求背景
在某地客户现场,遇到一个需求,将一个数据库中的某个表的数据导入到另外一台服务器上的数据库,并且表中包含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();
}
}
}
}
}
创作不易,如果文章对你有所帮助,请为博主点个赞吧!