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();

}

}

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

  1. oracle 数据库中执行数据库语句能找到数据,但是程序中却抓取不到

    oracle 数据库中执行数据库语句能找到数据,但是程序中却抓取不到? 原因:数据库中插入数据时没有commit,执行COMMIT后就可以查询到. 转载于:https://www.cnblogs.co ...

  2. oracle复制数据库文件,ORACLE数据库文件转移到另一台机器的方法

    ORACLE数据库教程文件转移到另一台机器的方法 因为恢复视频数据导致空间不足而终止,需要转移部分数据文件到别的硬盘里.在参照部分 网络资料,结合自己的实践,总结出Oracle数据文件转移方法. 1) ...

  3. oracle 中某张表备份,张表系统流程(java程序备份及恢复SQL2000中数据库中的某张表)...

    java程序备份及恢复SQL2000中数据库中的某张表 你可以现在数据库里面建立一张视图,视图里面的SQL语句就是查询该数据库中的表明,这就是访问系统表的内容,只提供单独一个列,然后展示给客户,当客户 ...

  4. oracle数据库实现不同数据库之间的表格数据定期同步

    1.创建数据库连接 CREATE PUBLIC DATABASE LINK DBLINK01 CONNECT TO 用户名 IDENTIFIED BY 密码 USING '(DESCRIPTION = ...

  5. aws 服务器之间文件转发,aws bucket之间相互拷贝数据

    在s3是使用过程中,最经常的操作基本就是拷贝了,s3上是按 这么结构存储数据的,在s3上可以创建bucket,然后就可以在bucket里放入数据了,每个 bucket下也可以建立不同目录, 这也是s3 ...

  6. Oracle复制解决方案

    转自:http://tech.it168.com/a2009/1023/788/000000788673.shtml 1.范围 本文讨论的是Oracle数据库提供的数据复制机制,所讨论的解决方案全部与 ...

  7. 如何在JAVA程序中使用Struct一次传入多条数据给Oracle的存储过程

    http://blog.csdn.net/dutguoyi/article/details/1879416 为了减少连接Oracle数据库的数量,需要将多条数据作为变量一次传入Oracle的存储过程中 ...

  8. Oracle 10g R2 数据库的克隆---物理拷贝克隆

    在日常的工作中DBA经常会遇到数据的转移,最典型的就是要将在线系统运行的数据库导入到测试环境中,以进行相关的升级测试和压力测试等. 下面介绍两种方式克隆数据库. 一.直接的物理拷贝克隆 此种方式比较简 ...

  9. 【oracle灾备方案系列】基于DDS的Oracle复制容灾方案(三)

    <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /> [oracle ...

最新文章

  1. Python 线程----线程方法,线程事件,线程队列,线程池,GIL锁,协程,Greenlet
  2. go设计模式之代理模式
  3. Codeforces732D Exams
  4. 【学术相关】以前写过水论文怎么办?
  5. Android开发 - 掌握ConstraintLayout(七)辅助线(Guideline)
  6. Showdoc 搭建项目 API 文档系统
  7. rhel mysql安装_RHEL6.4下MySQL安装方法及简单配置
  8. PyQT:This application failed to start because no Qt platform plugin could be initialized.
  9. 从零搭建Redis-Scrapy分布式爬虫
  10. 有经验的面试官都是如何快速判断程序员能力的?
  11. 关系运算符 与 逻辑运算符
  12. 推荐系统在滴滴司机调度系统中的应用实践
  13. linux中如何批量修改文件名
  14. MySQL---数据库从入门走向大神系列(二)-用Java对MySQL进行增删改查
  15. ES6 let 与 const 与 var 的区别与使用
  16. 急救护理虚拟仿真实验室
  17. Android 颜色透明度(不透明度)计算
  18. Spark-Sql源码解析之三 Analyzer:Unresolved logical plan – analyzed logical plan
  19. vue漂亮的企业网站模板
  20. 获取b站某个up的视频aid、cid

热门文章

  1. Redis 笔记(05)— hash 类型(设置获取单个hash值、判断hash键是否存在、设置获取多个hash值、获取所有hash的键、获取所有hash的值、删除hash指定键)
  2. Android Animation (安卓动画)概念简介
  3. Linux 内核,30 年C 语言将升级至 C11
  4. Python:Item Pipeline
  5. Docker核心技术之容器详解
  6. 浅谈MySQL中utf8和utf8mb4的区别
  7. 你哪来这么多事(六):职工信息查找
  8. Python 字典的 使用
  9. Android 逐帧动画(Frame)
  10. R.Java文件报错