JAVA-MySQL與Oracle或者(Oracle與MySQL)之間相互拷貝數據


1、數據庫信息

MySQL :5.6.38  Oracle:11.2.0.1.0

2、建表信息

MySQL:

CREATE TABLE cs (
id INT ,
cname VARCHAR (20),
phone VARCHAR (11)
) DEFAULT CHARSET = utf8 ;

Oracle:

create table cs
(
id number(10) ,
cname varchar2(50) not null,
phone varchar2(11) not null
);

3、MySQL執行命令

SELECT * FROM cs; 查詢表數據

SHOW FULL COLUMNS FROM cs; 查看表字段字符集

DESC cs; 查看表結構

DROP TABLE cs;  刪除表

DELETE FROM cs; 清空表

4、Oracle執行命令

SELECT * FROM cs; 查詢表數據

DESC cs; 查看表結構

DROP TABLE cs;  刪除表

DELETE FROM cs; 清空表

SELECT  userenv('language') FROM DUAL; 查看字符集

5、准備驗證測試數據插入表cs中(也可以先插入MySQL,反過來插入Oracle)

INSERT INTO cs VALUES(1,'李四','15398037986');

INSERT INTO cs VALUES(2,'張三','15398031324');

INSERT INTO cs VALUES(3,'王五','15691432979');

6、開始驗證Oracle同步到MySQL(Java類如下),表名cs。

package oracle.mysql.com;

import java.sql.*;

/**
* 這是一個將Oracle數據庫中的數據拷貝到MySQL數據庫中的簡單程序。
* 僅考慮NUMBER/CHAR/VARCHAR/CLOB/DATE/TIMESTAMP等字段類型。
* BLOB沒有考慮(因為我的數據庫中沒有BLOB字段,無法測試)。 前提:兩個數據庫中都具有相關的表,且表結構相同,目標數據庫中還不能存在沖突的數據。
*/
public class CopyOracle2MySQL {
// 源數據庫,目標數據庫的連接配置
private final String DEST_MYSQL_JDBC_URL = "jdbc:mysql://192.168.0.2:3306/cs?user=txytest&password=txytest123&useUnicode=true&characterEncoding=utf-8";
private final String SOURCE_JDBC_URL = "jdbc:oracle:thin:@localhost:1521:bdorcl";
private final String SOURCE_JDBC_USER = "community";
private final String SOURCE_JDBC_PASSWORD = "community123";

public void startImport() throws Exception {
// 創建到兩個數據庫的連接
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 {

// 人工輸入各表名(需要保證順序,以確保有外鍵的表在主表之后插入數據)
importTable(connSource, connDest, "cs");

} finally {
// 自動關閉數據庫資源
connDest.close();
connSource.close();
}
}

private void importTable(Connection connSource, Connection connDest, String tablename) throws Exception {
Statement stmt = null;
PreparedStatement pstmt = null;
try {
// 給PreparedStatement賦值,然后更新;如果是大數量的情況,可以考慮Batch處理。因為這里的數據量小,直接單條更新了。
// 打開源數據庫中相關表
StringBuilder insertSQL = new StringBuilder();
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) {
pstmt.setInt(i, rs.getInt(i));
} else if (rsmd.getColumnType(i) == java.sql.Types.DOUBLE) {
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) {
pstmt.setString(i, rs.getString(i));
} else if (rsmd.getColumnType(i) == java.sql.Types.DATE) {
pstmt.setDate(i, rs.getDate(i));
} else if (rsmd.getColumnType(i) == java.sql.Types.TIMESTAMP) {
pstmt.setTimestamp(i, rs.getTimestamp(i));
} else {
pstmt.setObject(i, rs.getObject(i));
}
}
pstmt.addBatch();

// 輸出統計信息
count++;
if (count % batchCount == 0) {
// 若干條提交一次
System.out.println("---------------正在更新數據庫--------------------");
pstmt.executeBatch();
System.out.println(count + "正在更新");
}
}
if (count % batchCount != 0) {
// 最后提交一次
System.out.println("---------------最后一次更新數據庫--------------------");
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) throws Exception {
CopyOracle2MySQL ins = new CopyOracle2MySQL();
ins.startImport();

}
}

7、開始驗證MySQL同步到Oracle(Java類如下),表名cs。

package mysql.oracle.com;

import java.sql.*;

/**
* 從MySQL數據庫拷貝表數據到Oracle數據庫中的程序。 前提:兩個數據庫中都具有相關的表,且表結構相同,目標數據庫中還不能存在沖突的數據。
*/
public class CopyMySQL2Oracle {
// 源數據庫,目標數據庫的連接配置
String mysql_jdbc_url = "jdbc:mysql://192.168.0.2:3306/cs?user=txytest&password=txytest123&useUnicode=true&characterEncoding=gb2312";
String jdbc_url = "jdbc:oracle:thin:@localhost:1521:bdorcl";
String jdbc_user = "community";
String jdbc_password = "community123";

public void startProcess(String tableName) throws Exception {
// 創建到兩個數據庫的連接
Class.forName("org.gjt.mm.mysql.Driver");
Connection connSource = DriverManager.getConnection(mysql_jdbc_url);

Class.forName("oracle.jdbc.driver.OracleDriver");
Connection connDest = DriverManager.getConnection(jdbc_url, jdbc_user, jdbc_password);

// 打開源數據庫中相關表
StringBuilder sb = new StringBuilder();
sb.append("insert into " + tableName + "(");
Statement stmt = connSource.createStatement();
ResultSet rs = stmt.executeQuery("select * from " + tableName);

// 顯示共計有多少條記錄
rs.last();
System.out.println(tableName + "表共計有:" + rs.getRow() + "條記錄,正在處理......");
rs.beforeFirst();

// 先計算目標數據庫的PreparedStatement的SQL語句
ResultSetMetaData rsmd = rs.getMetaData();
int numberOfColumns = rsmd.getColumnCount();
for (int i = 1; i <= numberOfColumns; i++) {
sb.append(rsmd.getColumnName(i) + ",");
}
sb.deleteCharAt(sb.length() - 1);
sb.append(")values(");
for (int i = 1; i <= numberOfColumns; i++) {
sb.append("?,");
}
sb.deleteCharAt(sb.length() - 1);
sb.append(")");
System.out.println(sb.toString());

// 給PreparedStatement賦值,然后更新;如果是大數量的情況,可以考慮Batch處理。因為這里的數據量小,直接單條更新了。
PreparedStatement pstmt = connDest.prepareStatement(sb.toString());
while (rs.next()) {
for (int i = 1; i <= numberOfColumns; i++) {
pstmt.setObject(i, rs.getObject(i));
}

pstmt.executeUpdate();
}
System.out.print("---更新完成---");

// 關閉各資源
rs.close();
stmt.close();
pstmt.close();

connSource.close();
connDest.close();
}

public static void main(String[] args) throws Exception {
CopyMySQL2Oracle ins = new CopyMySQL2Oracle();
ins.startProcess("cs");

}
}

8、以上准備完成之后,即可運行驗證。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM