因为项目变更,需要把数据从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. MongoDB 关系

    MongoDB 的关系表示多个文档之间在逻辑上的相互联系. 文档间可以通过嵌入和引用来建立联系. MongoDB 中的关系可以是: 1:1 (1对1) 1: N (1对多) N: 1 (多对1) N: ...

  2. GDAL C#中文路径,中文属性名称乱码问题

    昨天写的博客,将C#读取shp中文属性值乱码的问题应该可以解决,博客地址为:http://blog.csdn.net/liminlu0314/article/details/54096119,然后又测 ...

  3. ubuntu ssh 防止登陆断开

    client 端: echo -e '\nServerAliveInterval 30' >> ~/.ssh/ssh_config server 端: echo -e '\nClientA ...

  4. Linux Mint 17一周使用体验

    1 Win7下安装Mint双系统 Linux Mint支持直接从Win7硬盘引导安装,非常方便,不用制作U盘引导,更不用刻盘安装了.Mint有Cinnamon和Mate两种桌面,听说Mate更加简洁节 ...

  5. HA机制下的Hadoop配置

    [版权申明:本文系作者原创,转载请注明出处] 文章出处:http://www.cnblogs.com/sdksdk0/p/5585355.html 作者: 朱培    ID:sdksdk0 ----- ...

  6. Android图表库MPAndroidChart(三)——双重轴线形图的实现,这次就so easy了

    Android图表库MPAndroidChart(三)--双重轴线形图的实现,这次就so easy了 在学习本课程之前我建议先把我之前的博客看完,这样对整体的流程有一个大致的了解 Android图表库 ...

  7. 微信小程序基本组件概述

    为了更好的理解微信小程序,本文90%文字描述来源于官网的介绍.官网原链接https://mp.weixin.qq.com/debug/wxadoc/dev/component/?t=20161222 ...

  8. 好用的SQLAlchemy

    准备 安装SQLAlchemy框架 测试代码 知识点剖析 引入库支持 基类和引擎 实体类 声明类 数据库自动完成 CRUD 总结 这里简单的记录一下本人第一次使用SQLAlchemy这个ORM框架的过 ...

  9. python 3.3.3 字面量,正则,反斜杠和原始字符串

    两个不起眼但是比较重要的设定 Python str类型的字面量解释器 当反斜杠及其紧接字符无法构成一个具有特殊含义的序列('recognized escape sequences')时,Python选 ...

  10. Tomcat 5.5 JNDI Resource 配置 (tomcat数据源配置)

    转自:http://blog.csdn.net/fenglibing/article/details/4528512 Tomcat 5.5 JNDI Resource 配置 Author Blog:h ...