因为项目变更,需要把数据从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的更多相关文章
-
利用Navicat premium实现将数据从Oracle导入到MySQL
背景:我们给用户提供了新的直播系统,但客户之前的老系统用的数据库是Oracle,我们提供的新系统用的是MySQL 客户诉求:将老系统中的所有直播数据导入到MySQL中: 思路:我知道Navicat有数 ...
-
从Oracle迁移到MySQL的各种坑及自救方案
当企业内部使用的数据库种类繁杂时,或者有需求更换数据库种类时,都可能会做很多数据迁移的工作.有些迁移很简单,有些迁移可能就会很复杂,大家有没有考虑过为了顺利完成复杂的数据库迁移任务,都需要考虑并解决哪 ...
-
迁移mysql数据到oracle上
转自:http://www.cnblogs.com/Warmsunshine/p/4651283.html 我是生成的文件里面的master.sql里面的sql,一个一个拷出来的. 迁移mysql数据 ...
-
完美转换MySQL的字符集 Mysql 数据的导入导出,Mysql 4.1导入到4.0
MySQL从4.1版本开始才提出字符集的概念,所以对于MySQL4.0及其以下的版本,他们的字符集都是Latin1的,所以有时候需要对mysql的字符集进行一下转换,MySQL版本的升级.降级,特别是 ...
-
怎么将oracle的sql文件转换成mysql的sql文件
怎么将sql文件导入PowerDesigner中的方法(将oracle的sql文件转换成mysql的sql文件)呢? 怎么将xx.sql文件的数据库结构导入powerdesigner 的方法呢? 现讲 ...
-
mysql导入数据到oracle中
mysql导入数据到oracle中. 建立Oracle表: CREATE TABLE "GG_USER" ( "USERID" BYTE) NOT NULL, ...
-
mybatis foreach批量插入数据:Oracle与MySQL区别
mybatis foreach批量插入数据:Oracle与MySQL不同点: 主要不同点在于foreach标签内separator属性的设置问题: separator设置为","分 ...
-
利用sqlldr从MySQL导出一张表数据到Oracle
根据业务需求,需要从MySQL库中同步一张表tap_application到Oracle中,下面是记录的导入过程. 1. 查看MySQL表结构 desc tap_application; +----- ...
-
Mycat实战之数据迁移(oracle -- mysql)
1.案例场景: Mycat 后面接一个 Oracle 实例与一个 MySQL 实例,假设用户表,订单表,转账记录表, Oracle 字符集为 GBK 的,MySQL 字符集则要求 UTF8的 完成用户 ...
随机推荐
-
easyui 中重复加载两次url
之前一直在使用easyui中,忽视了官网上的小细节,类似于datagrid.combobox 等组件在使用的时候,它的数据加载方式分为两种: 官网中: ①在html中,比如: <table id ...
-
C++运用SDK截屏
引言 最近有一个需要截取当前屏幕,并保存成BMP文件的需求.整个需求,拆分成三步:1.截取屏幕,获得位图数据.2.配合bmp文件结构信息,将数据整合.3.对整合后的数据做操作,如保存在本地.通过网络传 ...
-
C# Struct的内存布局
转载:http://www.csharpwin.com/csharpspace/10454r4891.shtml 问题:请说出以下struct的实例大小以及内存布局 struct Struct1 { ...
-
ubuntu系统mysql.h no such file or directory
在Ubuntu系统中,你已经安装了mysql,即你使用sudo apt-get install mysql-server mysql-client然而使用C语言访问mysql数据库时,却发现出现了如下 ...
-
Android应用开发基础篇(9)-----SharedPreferences
链接地址:http://www.cnblogs.com/lknlfy/archive/2012/02/27/2370319.html 一.概述 对于SharedPreferences,我吧它理解为一种 ...
-
.NET Core+Selenium+Github+Travis CI =>; SiteHistory
前言 总是三分钟热度的我折腾了一个可以每天自动截取指定网站页面并保存到Github的项目SiteHistory,感觉挺好(每次都这样). 想知道YouTube今天的首页长啥样么?点此查看 想知道You ...
-
equals与==号的区别?
equals与 == 的区别 初学Java的人(me),有很长一段时间对equals()这个方法感到很懊恼,实在是弄不明白到底何时比较的是地址,又什么时候比较内容呢?因为要找工作,要面试.本人通过查阅 ...
-
第四章——训练模型(Training Models)
前几章在不知道原理的情况下,已经学会使用了多个机器学习模型机器算法.Scikit-Learn很方便,以至于隐藏了太多的实现细节. 知其然知其所以然是必要的,这有利于快速选择合适的模型.正确的训练算法. ...
-
flask hook
@app.before_first_requestdef before_first_request(): """在第一次请求之前会访问该函数""&qu ...
-
Luogu3579 Solar Panels
整除分块枚举... 真的没有想到会这么简单. 要使一个数 \(p\) 满足 条件, 则 存在\(x, y\), \(a<=x \times p<=b\ \&\&\ c< ...