因为项目变更,需要把数据从oracle里转到mysql里。





第一个想法,自己写代码。

20分钟后,算了,还是找找工具吧。





第二步:

下了一个工具,二十分钟后,师兄发现,表的结构是倒完了,但是有的表数据全部倒好了,有的表数据只倒了一半。

算了,换个思路吧。





第三步:

A

算了,自己动手丰衣足食,在第二步已经有mysql表结构的基础上,数据通过代码来倒吧。

自己使用的是原生的jdbc,写了10分钟,看到满篇的Statement,ResultSet,算了,再换个思路吧。

B

我借用了spring的jdbctemplate。spring的xml如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
   	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   	xmlns:p="http://www.springframework.org/schema/p"
	xmlns:aop="http://www.springframework.org/schema/aop"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:jee="http://www.springframework.org/schema/jee"
	xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
		http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-4.0.xsd
		http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd">  

	<!-- 数据库连接池c3p0配置 -->
	<bean id="dataSourceOracle" class="com.mchange.v2.c3p0.ComboPooledDataSource"
		destroy-method="close">
		<property name="jdbcUrl" value="jdbc:oracle:thin:@10.150.0.888:1521:orcl"></property>
		<property name="driverClass" value="oracle.jdbc.driver.OracleDriver"></property>
		<property name="user" value=""></property>
		<property name="password" value=""></property>
		<property name="maxPoolSize" value="40"></property>
		<property name="minPoolSize" value="1"></property>
		<property name="initialPoolSize" value="1"></property>
		<property name="maxIdleTime" value="20"></property>
	</bean>
	<bean id="jdbcTemplateOracle" class="org.springframework.jdbc.core.JdbcTemplate">
		<property name="dataSource" ref="dataSourceOracle" />
	</bean>

		<!-- 数据库连接池c3p0配置 -->
	<bean id="dataSourceMysql" class="com.mchange.v2.c3p0.ComboPooledDataSource"
		destroy-method="close">
		<property name="jdbcUrl" value="jdbc:mysql://10.150.0.888/cdm2"></property>
		<property name="driverClass" value="com.mysql.jdbc.Driver"></property>
		<property name="user" value=""></property>
		<property name="password" value=""></property>
		<property name="maxPoolSize" value="40"></property>
		<property name="minPoolSize" value="1"></property>
		<property name="initialPoolSize" value="1"></property>
		<property name="maxIdleTime" value="20"></property>
	</bean>
	<bean id="jdbcTemplateMysql" class="org.springframework.jdbc.core.JdbcTemplate">
		<property name="dataSource" ref="dataSourceMysql" />
	</bean>
</beans>

下面的源代码

package db;

import java.sql.Timestamp;
import java.util.List;
import java.util.Map;

import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.JdbcTemplate;

public class DBTransfer {
	public static void main(String[] args) {
		ClassPathXmlApplicationContext factory = new ClassPathXmlApplicationContext(
				"applicationContext2.xml");
		JdbcTemplate jdbcTemplateOracle = (JdbcTemplate) factory
				.getBean("jdbcTemplateOracle");
		JdbcTemplate jdbcTemplateMysql = (JdbcTemplate) factory
				.getBean("jdbcTemplateMysql");
		List<Map<String, Object>> tableNames = jdbcTemplateOracle
				.queryForList("select table_name from user_tables");
		for (Map<String, Object> map : tableNames) {
			String tableName = (String) map.get("table_name");   //开始转换一张新的表
			System.out.println("正在转换:" + tableName);
			List<Map<String, Object>> datas = jdbcTemplateOracle
					.queryForList("select * from " + tableName);
			List<Map<String, Object>> columnNames = jdbcTemplateOracle
					.queryForList("SELECT COLUMN_NAME,DATA_TYPE FROM SYS.All_Tab_Columns tc "
							+ " where tc.TABLE_NAME='" + tableName + "' ");
			StringBuilder prefix = null;                //每张表的前缀都是一样的 第一次统一获取
			prefix = new StringBuilder();
			prefix.append("insert into " + tableName + " ( ");
			for (Map<String, Object> column : columnNames) {
				prefix.append(column.get("COLUMN_NAME"));
				prefix.append(",");
			}

			prefix = new StringBuilder(prefix.substring(0, prefix.length() - 1));
			prefix.append(")");
			StringBuilder sb = null;
			for (Map<String, Object> data : datas) {    //处理表中的每一行数据

				sb = new StringBuilder(prefix);   //把之前的前缀拿过来
				sb.append(" values( ");
				String columnName = "";
				for (Map<String, Object> column : columnNames) {
					columnName = (String) column.get("COLUMN_NAME");
					if (data.get(columnName)!=null) {    //

						//处理各种类型的数据
						if (column.get("DATA_TYPE").equals("VARCHAR2")) {
							sb.append("'" + data.get(columnName) + "'");
						}
						if (column.get("DATA_TYPE").equals("NUMBER")) {
							sb.append(data.get(columnName));
						}
						if (column.get("DATA_TYPE").equals("DATE")) {
							Timestamp dateStr=(Timestamp) data.get(columnName);
							sb.append("'" + dateStr + "'");
						}

					}else {
						sb.append("null");
					}

					sb.append(",");
				}
				sb = new StringBuilder(sb.substring(0, sb.length() - 1));
				sb.append(")");

				jdbcTemplateMysql.update(sb.toString());
			}

		}

	}
}

我们项目里,之前的oracle里存的数据格式都很简单,也没有复杂的函数,上面的代码已经够用了,如果大家在使用的时候,出了bug,就再修改吧。

数据从oracle转换到mysql的更多相关文章

  1. 利用Navicat premium实现将数据从Oracle导入到MySQL

    背景:我们给用户提供了新的直播系统,但客户之前的老系统用的数据库是Oracle,我们提供的新系统用的是MySQL 客户诉求:将老系统中的所有直播数据导入到MySQL中: 思路:我知道Navicat有数 ...

  2. 从Oracle迁移到MySQL的各种坑及自救方案

    当企业内部使用的数据库种类繁杂时,或者有需求更换数据库种类时,都可能会做很多数据迁移的工作.有些迁移很简单,有些迁移可能就会很复杂,大家有没有考虑过为了顺利完成复杂的数据库迁移任务,都需要考虑并解决哪 ...

  3. 迁移mysql数据到oracle上

    转自:http://www.cnblogs.com/Warmsunshine/p/4651283.html 我是生成的文件里面的master.sql里面的sql,一个一个拷出来的. 迁移mysql数据 ...

  4. 完美转换MySQL的字符集 Mysql 数据的导入导出,Mysql 4.1导入到4.0

    MySQL从4.1版本开始才提出字符集的概念,所以对于MySQL4.0及其以下的版本,他们的字符集都是Latin1的,所以有时候需要对mysql的字符集进行一下转换,MySQL版本的升级.降级,特别是 ...

  5. 怎么将oracle的sql文件转换成mysql的sql文件

    怎么将sql文件导入PowerDesigner中的方法(将oracle的sql文件转换成mysql的sql文件)呢? 怎么将xx.sql文件的数据库结构导入powerdesigner 的方法呢? 现讲 ...

  6. mysql导入数据到oracle中

    mysql导入数据到oracle中. 建立Oracle表: CREATE TABLE "GG_USER" ( "USERID" BYTE) NOT NULL, ...

  7. mybatis foreach批量插入数据:Oracle与MySQL区别

    mybatis foreach批量插入数据:Oracle与MySQL不同点: 主要不同点在于foreach标签内separator属性的设置问题: separator设置为","分 ...

  8. 利用sqlldr从MySQL导出一张表数据到Oracle

    根据业务需求,需要从MySQL库中同步一张表tap_application到Oracle中,下面是记录的导入过程. 1. 查看MySQL表结构 desc tap_application; +----- ...

  9. Mycat实战之数据迁移(oracle -- mysql)

    1.案例场景: Mycat 后面接一个 Oracle 实例与一个 MySQL 实例,假设用户表,订单表,转账记录表, Oracle 字符集为 GBK 的,MySQL 字符集则要求 UTF8的 完成用户 ...

随机推荐

  1. java里String类为何被设计为final

    前些天面试遇到一个非常难的关于String的问题,"String为何被设计为不可变的"?类似的问题也有"String为何被设计为final?"个人认为还是前面一 ...

  2. FJUT寒假作业涨姿势题解

    题意非常简单易懂,对于涨姿势0,数据非常小,比较容易想到的是直接循环暴力解题完成任务.把数据放入数组arr,循环i,j控制所有区间算和.结果记入vis. 到了涨姿势1,2,3,我们观察数据变化,发现数 ...

  3. Node.js DNS 模块

    Node.js DNS 模块用于解析域名.引入 DNS 模块语法格式如下: var dns = require("dns") 方法 序号 方法 & 描述 1 dns.loo ...

  4. Docker内核能力机制

    能力机制(Capability)是 Linux 内核一个强大的特性,可以提供细粒度的权限访问控制. Linux 内核自 2.2 版本起就支持能力机制,它将权限划分为更加细粒度的操作能力,既可以作用在进 ...

  5. TensorFlow入门和示例分析

    本文以TensorFlow源码中自带的手写数字识别Example为例,引出TensorFlow中的几个主要概念.并结合Example源码一步步分析该模型的实现过程. 一.什么是TensorFlow 在 ...

  6. Android自定义View(CustomCalendar-定制日历控件)

    转载请标明出处: http://blog.csdn.net/xmxkf/article/details/54020386 本文出自:[openXu的博客] 目录: 1分析 2自定义属性 3onMeas ...

  7. 【Android应用开发】 Universal Image Loader ( 使用简介 | 示例代码解析 )

    作者 : 韩曙亮 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/50824912 相关地址介绍 : -- Universal I ...

  8. 在android系统上写C语言程序--开机启动该程序不进入安卓系统

    今天要写的这篇博文意义重大,也是网上很少有的,这是在我工作中学会的一项技术,当然,它也是由简单的问题组合而来的.如何在安卓中写C语言程序,调试安卓驱动,测试程序的的一项重要技能,下面我就不说废话了,直 ...

  9. WEB音频API

    本文转载至 http://www.webhek.com/web-audio-api 很偶然的,在一个微信公众号里面,看到了这样的一篇文章. WEB音频API.作者分享技术的优良品质值得我们学习. 原文 ...

  10. Android自定义ViewGroup(四、打造自己的布局容器)

    转载请标明出处: http://blog.csdn.net/xmxkf/article/details/51500304 本文出自:[openXu的博客] 目录: 简单实现水平排列效果 自定义Layo ...