Oracle数据迁移到Mysql的引擎设计及实现

本文介绍了一种在Oracle数据无法直接读取的情况下,使用SpringBoot进行Oracle到Mysql的数据迁移方法。通过自定义数据库连接类、定时任务和Mybatis实现数据同步。配置文件中设置数据源,并在代码中读取Oracle密码文件,实现数据库连接。使用Navicat作为DBMS管理工具,展示了定时任务执行SQL查询和数据插入的示例。

Oracle数据迁移到Mysql的引擎设计及实现

设计初衷

在一次项目中,因为需求需要,再保证Oracle数据不提供直接读取求改的条件下,进行部分试图内的数据迁移,迁移到当时项目所自行设计的Mysql业务内;由于考察了市场的一些数据迁移软件后,觉得没有自己设计更灵活和轻量级,因此自己做了尝试;可能还不完善,期待探讨交流;

整体思路

  1. 利用SpringBoot轻量级应用
  2. 涉及部分Mysql与Oracle基本操作内容
  3. yml 数据源主配置为mysql,Oracle连接部分设计连接类
  4. 数据定时同步- - -采用@EnableScheduling实现的TimerAction
  5. 数据持久层操纵 整合了Mybatis(plus也可)
  6. DBMS 管理系统采用Navicat 比较方便,可以同时整合连接oracle和mysql
  7. Oracle数据库密码设置从本地指定文件目录读取,便于项目启动后数据库 密码的修改

具体案例实现(代码)

  1. 数据库连接类(与Oracle)
public class Conn {

    //数据库预加载信息
    static String driverClass="oracle.jdbc.driver.OracleDriver";    //oracle的驱动
    //连接oracle路径方式 “orcl”是要建立连接的数据库名 1521端口

    public static Connection getConnection() throws ClassNotFoundException, SQLException, FileNotFoundException, IllegalAccessException, InstantiationException {

        String url="";
        String user = "";
        String password = "";
        File file =new File("D:/OracleInfo.txt");
        Scanner input=new Scanner(file);
        while(input.hasNext()){
            url = input.nextLine();
            user = input.nextLine();
            password = input.nextLine();
        }
        input.close();
        Connection connection = null;
        Class.forName(driverClass).newInstance();
        connection = DriverManager.getConnection(url, user, password);

        System.out.println("Oracle数据库连接成功,用户:"+ user);

        return connection;
    }

}
  1. 对应的SpringBoot中项目连接数据源dataSource及其他相关配置
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/xxxx?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true

    username: xxxx
    password: xxxx

mybatis:
  mapperLocations: classpath*:mapper/*.xml
  configuration:
    map-underscore-to-camel-case: true
    
server:
  port: 8088

  tomcat:
    uri-encoding: UTF-8
  1. 对应TimerAction样例:
    @Scheduled(cron = "0 0/50 * * * ?")
    public void TestTimer() {
        log.info("This is stuCourseTimer,present clock:[{}]", LocalTime.now().toString());
        try {
            Connection conn;
            ResultSet result;
            Statement state = null;
            //样例 自己按照需要写sql语句即可
            String sql = "select *****";

            conn = Conn.getConnection();
            if (conn != null){
                state = conn.createStatement();
            }
            assert state != null;
            result = state.executeQuery(sql);

            while (result.next()) {
                String test1= result.getString("xxx");
                String test2= result.getString("xxx");

                if (transportMapper.findXXXByXXX(test1, test2) == null) {
                    String test3= result.getString("xxxxxx");
                    if (userMapper.findByXXXXX(xxx) == null) {
                     //自己写即可
                    } else if (xxx == null) {
                     //自己写即可 
                    }
                    Integer XXX= userMapper.findXXX(aaa).getId();
                    Integer XXX= XXXMapper.findXXX(bbb);
                    transportMapper.insertXXXInfo(id1, id2, Content)
                }
            }

            sql = "select * from XXX";
            result = state.executeQuery(sql);

            while (result.next()) {
                
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
  1. 在对应的XML中写入具体sql操作即可;

By Daniel Smith-答
期待与大家交流;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Daniel_Smith

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值