oracle 复制 mysql_MySQL与Oracle之间互相拷贝数据的Java程序

packagecom.clzhang.sample.jdbc;import java.sql.*;/*** 这是一个将Oracle数据库中的数据拷贝到MySQL数据库中的简单程序。

* 仅考虑NUMBER/CHAR/VARCHAR/CLOB/DATE/TIMESTAMP等字段类型。

* BLOB没有考虑(因为我的数据库中没有BLOB字段,无法测试)。

*

* 前提:两个数据库中都具有相关的表,且表结构相同,目标数据库中还不能存在冲突的数据。

*@authoracer

**/

public classCopyOracle2MySQL {//源数据库,目标数据库的连接配置

private final String DEST_MYSQL_JDBC_URL = "jdbc:mysql://localhost/mybbs?user=root&password=password1&useUnicode=true&characterEncoding=utf-8";private final String SOURCE_JDBC_URL = "jdbc:oracle:thin:@127.0.0.1:1521:orcl";private final String SOURCE_JDBC_USER = "mybbs";private final String SOURCE_JDBC_PASSWORD = "bbs001";public void startImport() throwsException {//创建到两个数据库的连接

Class.forName("org.gjt.mm.mysql.Driver");

Class.forName("oracle.jdbc.driver.OracleDriver");

Connection connDest=DriverManager.getConnection(DEST_MYSQL_JDBC_URL);

Connection connSource=DriverManager.getConnection(SOURCE_JDBC_URL, SOURCE_JDBC_USER,

SOURCE_JDBC_PASSWORD);//查询出当前用户下面的所有表,依次处理(如果有外键,建议人工输入各表,以保证顺序;如果没有外键,直接运行下面程序即可。)

try{/**// 方式一:自动运行

Statement stmt = connSource.createStatement();

ResultSet rs = stmt.executeQuery("select TABLE_NAME from USER_TABLES");

while(rs.next()) {

try {

importTable(connSource, connDest, rs.getString("TABLE_NAME"));

} catch (Exception e) {

e.printStackTrace();

}

}

rs.close();

stmt.close();*/

//方式二:人工输入各表名(需要保证顺序,以确保有外键的表在主表之后插入数据)

importTable(connSource, connDest, "BBSDETAIL");

importTable(connSource, connDest,"BBSCOMMENT");

}finally{//自动关闭数据库资源?

connDest.close();

connSource.close();

}

}private void importTable(Connection connSource, Connection connDest, String tablename) throwsException {

Statement stmt= null;

PreparedStatement pstmt= null;try{//给PreparedStatement赋值,然后更新;如果是大数量的情况,可以考虑Batch处理。因为这里的数据量小,直接单条更新了。//打开源数据库中相关表

StringBuilder insertSQL = newStringBuilder();

insertSQL.append("insert into " + tablename + "(");

stmt=connSource.createStatement();

ResultSet rs= stmt.executeQuery("select * from " +tablename);//先计算目标数据库的PreparedStatement的SQL语句

ResultSetMetaData rsmd =rs.getMetaData();int numberOfColumns =rsmd.getColumnCount();for(int i=1; i<=numberOfColumns;i++) {

insertSQL.append(rsmd.getColumnName(i)+ ",");

}

insertSQL.deleteCharAt(insertSQL.length()-1);

insertSQL.append(")values(");for(int i=1; i<=numberOfColumns;i++) {

insertSQL.append("?,");

}

insertSQL.deleteCharAt(insertSQL.length()-1);

insertSQL.append(")");

System.out.println(insertSQL.toString());//计数

int count = 0;//每多少条记录提交一次,以提高效率

int batchCount = 1000;

pstmt=connDest.prepareStatement(insertSQL.toString());while(rs.next()) {

pstmt.clearParameters();for(int i=1; i<=numberOfColumns;i++) {if(rsmd.getColumnType(i) ==java.sql.Types.NUMERIC) {//2

pstmt.setInt(i, rs.getInt(i));

}else if(rsmd.getColumnType(i) ==java.sql.Types.DOUBLE) {//8

pstmt.setDouble(i, rs.getDouble(i));

}else if(rsmd.getColumnType(i) ==java.sql.Types.CHAR|| rsmd.getColumnType(i) ==java.sql.Types.VARCHAR|| rsmd.getColumnType(i) ==java.sql.Types.CLOB) {//1//12//2005

pstmt.setString(i, rs.getString(i));

}else if(rsmd.getColumnType(i) ==java.sql.Types.DATE) {//91

pstmt.setDate(i, rs.getDate(i));

}else if(rsmd.getColumnType(i) ==java.sql.Types.TIMESTAMP) {//93

pstmt.setTimestamp(i, rs.getTimestamp(i));

}else{

pstmt.setObject(i, rs.getObject(i));

}

}

pstmt.addBatch();//输出统计信息

count++;if(count % batchCount == 0) {//若干条提交一次

System.out.println();

System.out.print("正在更新数据库...");

pstmt.executeBatch();

System.out.println(count);

}

}if(count % batchCount != 0) {//最后提交一次

System.out.println();

System.out.print("正在更新数据库...");

pstmt.executeBatch();

System.out.println(count);

}

rs.close();

}finally{if(stmt != null) stmt.close();if(pstmt != null) pstmt.close();

}

}public static void main(String[] args) throwsException {

CopyOracle2MySQL ins= newCopyOracle2MySQL();

ins.startImport();

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值