实验七-通过JDBC转移异构数据库中数据

通过ODBC/JDBC转移异构数据库中数据

实验环境:Windows 10操作系统、MySQL 8.0、SQL Server 2019、eclipse2021-09

实验内容与完成情况:

  • 实验目的

学会配置ODBC/JDBC数据源,熟悉使用ODBC/JDBC来进行数据库应用程序的设计,熟悉通过ODBC/JDBC接口访问异构数据库并对异构数据库进行操作。

  • 实验平台和实验工具

实验平台:2个异构数据库(MySQL 8.0和SQL Server 2019)。

通过JAVA语言编写访问数据库的应用程序。编程工具选用eclipse 2021-09。

  • 实验内容和要求

配置两个不同的数据源,使用ODBC/JDBC编写程序连接两个不同关系数据库管理系统的数据源,对异构数据库中的数据进行互相转移。如,将MySQL数据库的某个表中的数据转移到SQL Server数据库的表,将SQL Server中的数据转移至MySQL数据库。

  • 实验步骤
  1. 配置两个不同的数据库
    • 在MySQL中新建一个test7数据库。

    • 在SQL server中新建一个test7数据库。

  1. 在eclipse中新建一个java项目

  1. 新建一个JDBC包,用于连接两个数据库。

(1)JDBC连接SQL Server

    • 新建一个用于连接SQL Server的类

下载好的这三个jar包都行,如果选择高版本的会报错,可以换低版本的jar包:

导入jar包到项目:

    • 编写java代码连接SQL server数据库

package JDBC;

import java.sql.*;

public class sql_jdbc {

    public Connection dbConn = null;

    public String driverName = "com.microsoft.sqlserver.jdbc.SQLServerDriver"; // 驱动配置

    public String URL = "jdbc:sqlserver://localhost:1433;DatabaseName=test7;TrustServerCertificate=true;"; // 数据库位置

    public String userName = "sa"; // 数据库用户名

    public String userPwd = "123456"; // 数据库密码

    // 连接数据库

    public void insert() {

        // 导入SQL server驱动

        // 1.加载驱动

        try {

            Class.forName(driverName);

            // 2.建立连接

            dbConn = DriverManager.getConnection(URL, userName, userPwd);

            System.out.println("SQL Server数据库连接成功!");

        } catch (ClassNotFoundException | SQLException e) {

            e.printStackTrace();

            System.out.println("SQL Server数据库连接失败!");

        }

    }

    // 断开数据库

    public void disconnect() {

        try {

            dbConn.close();

            System.out.println("SQL Server数据库关闭成功!");

        } catch (SQLException e) {

            e.printStackTrace();

            System.out.println("SQL Server数据库关闭失败!");

        }

    }

}

(2)JDBC连接MySQL

  • 新建一个用于连接MySQL的类

导入jar包到项目:

  • 编写java代码连接MySQL数据库:

package JDBC;

import java.sql.*;

public class mysql_jdbc {

    public Connection connection = null;

    public String JDBC_DRIVER = "com.mysql.cj.jdbc.Driver"; // 驱动配置

    public String URL = "jdbc:mysql://localhost:3306/test7?useSSL=false"; // 数据库位置

    public String USER = "root"; // 数据库用户名

    public String PWD = "767701"; // 数据库密码

    // 连接数据库

    public void insert() {

        // 导入MySQL驱动

        // 1.加载驱动

        try {

            Class.forName(JDBC_DRIVER);

            // 2.建立连接

            connection = DriverManager.getConnection(URL, USER, PWD);

            System.out.println("MySQL数据库连接成功!");

        } catch (ClassNotFoundException | SQLException e) {

            System.out.println(e.getLocalizedMessage());

            System.out.println("MySQL数据库连接失败!");

        }

    }

    // 断开数据库

    public void disconnect() {

        try {

            connection.close();

            System.out.println("MySQL数据库关闭成功!");

        } catch (SQLException e) {

            e.printStackTrace();

            System.out.println("MySQL数据库关闭失败!");

        }

    }

}

  1. 将两个数据库建表、插入数据、查看数据等操作用两个类实现。
  1. 对SQL server数据库的操作
    • 新建一个类

    • 编写java代码

package JDBC;

import java.io.*;

import java.sql.*;

public class sql_op {

    public Statement state = null;

    public String[][] result1 = null; // 保存teacher表的结果

    public int row1 = 0;              // teacher表的行数

    public String[][] result2 = null; // 保存student表的结果

    public int row2 = 0;              // student表的行数

    // 连接数据库

    public void set_state(sql_jdbc Database) throws IOException {

        try {

            state = Database.dbConn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);

        } catch (SQLException e) {

            e.printStackTrace();

        }

    }

    // 初始化,删除数据库两个表

    public void init() throws IOException {

        try {

            String sql = "DROP TABLE IF EXISTS teacher";

            state.executeUpdate(sql);

            sql = "DROP TABLE IF EXISTS student";

            state.executeUpdate(sql);

        } catch (SQLException e) {

            e.printStackTrace();

        }

    }

    // 查询数据库中有哪些表

    public void show_tables() throws IOException {

        try {

            String sql = "SELECT name FROM sys.tables";

            ResultSet rs = state.executeQuery(sql);

            System.out.println("SQL server数据库中的表有:");

            while (rs.next()) {

                System.out.println(rs.getString(1));

            }

        } catch (SQLException e) {

            e.printStackTrace();

        }

    }

    // 新建一个教师表

    public void create_teacher_table() throws IOException {

        try {

            String sql = "CREATE TABLE teacher(id INT PRIMARY KEY NOT NULL,name VARCHAR(20) NOT NULL,age INT NOT NULL)";

            state.executeUpdate(sql);

            System.out.println("SQL Server创建教师表成功!");

        } catch (SQLException e) {

            e.printStackTrace();

            System.out.println("SQL Server创建教师表失败!");

        }

    }

    // 向教师表中插入数据

    public void insert_teacher(int id, String name, int age) throws IOException {

        try {

            String sql = "INSERT INTO teacher(id,name,age) VALUES(" + id + ",'" + name + "'," + age + ")";

            state.executeUpdate(sql);

        } catch (SQLException e) {

            e.printStackTrace();

        }

    }

    // 删除教师表中的所有数据

    public void delete_teacher() throws IOException {

        try {

            String sql = "DELETE FROM teacher";

            state.executeUpdate(sql);

        } catch (SQLException e) {

            e.printStackTrace();

        }

    }

   

    // 查看教师表中的数据并以数组的形式保存每一行的数据

    public void select_teacher() throws IOException {

        try {

            String sql = "SELECT * FROM teacher";

            ResultSet rs = state.executeQuery(sql);

            row1 = 0;

            while (rs.next()) {

                row1++;

            }

            result1 = new String[row1][3];

            rs.beforeFirst();

            int i = 0;

            while (rs.next()) {

                result1[i][0] = rs.getString(1);

                result1[i][1] = rs.getString(2);

                result1[i][2] = rs.getString(3);

                i++;

            }

        } catch (SQLException e) {

            e.printStackTrace();

        }

    }

    // 显示教师表中的数据

    public void show_teacher() throws IOException {

        System.out.println("查询到教师表中数据如下:");

        System.out.println("+----------+------------+----------+");

        System.out.println("|    id    |    name    |    age   |");

        System.out.println("+----------+------------+----------+");

        for (int i = 0; i < row1; i++) {

            System.out.printf("|%-10s|%-10s|%-10s|\n", result1[i][0], result1[i][1], result1[i][2]);

        }

        System.out.println("+----------+------------+----------+");

    }

    // 新建一个学生表

    public void create_student_table() throws IOException {

        try {

            String sql = "CREATE TABLE student(id INT PRIMARY KEY NOT NULL,name VARCHAR(20) NOT NULL,age INT NOT NULL)";

            state.executeUpdate(sql);

            System.out.println("SQL Server创建学生表成功!");

        } catch (SQLException e) {

            e.printStackTrace();

            System.out.println("SQL Server创建学生表失败!");

        }

    }

    // 向学生表中插入数据

    public void insert_student(int id, String name, int age) throws IOException {

        try {

            String sql = "INSERT INTO student(id,name,age) VALUES(" + id + ",'" + name + "'," + age + ")";

            state.executeUpdate(sql);

        } catch (SQLException e) {

            e.printStackTrace();

        }

    }

    // 删除学生表中的所有数据

    public void delete_student() throws IOException {

        try {

            String sql = "DELETE FROM student";

            state.executeUpdate(sql);

        } catch (SQLException e) {

            e.printStackTrace();

        }

    }

    // 查看学生表中的数据并以数组的形式保存每一行的数据

    public void select_student() throws IOException {

        try {

            String sql = "SELECT * FROM student";

            ResultSet rs = state.executeQuery(sql);

            row2 = 0;

            while (rs.next()) {

                row2++;

            }

            result2 = new String[row2][3];

            rs.beforeFirst();

            int i = 0;

            while (rs.next()) {

                result2[i][0] = rs.getString(1);

                result2[i][1] = rs.getString(2);

                result2[i][2] = rs.getString(3);

                i++;

            }

        } catch (SQLException e) {

            e.printStackTrace();

        }

    }

   

    // 显示学生表中的数据

    public void show_student() throws IOException {

        System.out.println("查询到学生表中数据如下:");

        System.out.println("+----------+------------+----------+");

        System.out.println("|    id    |    name    |    age   |");

        System.out.println("+----------+------------+----------+");

        for (int i = 0; i < row2; i++) {

            System.out.printf("|%-10s|%-10s|%-10s|\n", result2[i][0], result2[i][1], result2[i][2]);

        }

        System.out.println("+----------+------------+----------+");

    }

}

  1. 对MySQL数据库的操作
  • 新建一个类

  • 编写java代码

package JDBC;

import java.io.*;

import java.sql.*;

public class mysql_op {

    public Statement state = null;

    public String[][] result1 = null; // 保存teacher表的结果

    public int row1 = 0;              // teacher表的行数

    public String[][] result2 = null; // 保存student表的结果

    public int row2 = 0;              // student表的行数

    // 连接数据库

    public void set_state(mysql_jdbc Database) throws IOException {

        try {

            state = Database.connection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);

        } catch (SQLException e) {

            e.printStackTrace();

        }

    }

    // 初始化,删除数据库两个表

    public void init() throws IOException {

        try {

            String sql = "DROP TABLE IF EXISTS teacher";

            state.executeUpdate(sql);

            sql = "DROP TABLE IF EXISTS student";

            state.executeUpdate(sql);

        } catch (SQLException e) {

            e.printStackTrace();

        }

    }

    // 查询数据库中有哪些表

    public void show_tables() throws IOException {

        try {

            String sql = "SHOW TABLES";

            ResultSet rs = state.executeQuery(sql);

            System.out.println("MySQL数据库中的表有:");

            while (rs.next()) {

                System.out.println(rs.getString(1));

            }

        } catch (SQLException e) {

            e.printStackTrace();

        }

    }

   

    // 新建一个教师表

    public void create_teacher_table() throws IOException {

        try {

            String sql = "CREATE TABLE teacher(id INT PRIMARY KEY NOT NULL,name VARCHAR(20) NOT NULL,age INT NOT NULL)";

            state.executeUpdate(sql);

            System.out.println("MySQL创建教师表成功!");

        } catch (SQLException e) {

            e.printStackTrace();

            System.out.println("MySQL创建教师表失败!");

        }

    }

    // 向教师表中插入数据

    public void insert_teacher(int id, String name, int age) throws IOException {

        try {

            String sql = "INSERT INTO teacher(id,name,age) VALUES(" + id + ",'" + name + "'," + age + ")";

            state.executeUpdate(sql);

        } catch (SQLException e) {

            e.printStackTrace();

        }

    }

    // 删除教师表中的所有数据

    public void delete_teacher() throws IOException {

        try {

            String sql = "DELETE FROM teacher";

            state.executeUpdate(sql);

        } catch (SQLException e) {

            e.printStackTrace();

        }

    }

 

    // 查看教师表中的数据并以数组的形式保存每一行的数据

    public String[][] select_teacher() throws IOException {

        try {

            String sql = "SELECT * FROM teacher";

            ResultSet rs = state.executeQuery(sql);

            row1 = 0;

            while (rs.next()) {

                row1++;

            }

            result1 = new String[row1][3];

            rs.beforeFirst();

            int i = 0;

            while (rs.next()) {

                result1[i][0] = rs.getString("id");

                result1[i][1] = rs.getString("name");

                result1[i][2] = rs.getString("age");

                i++;

            }

        } catch (SQLException e) {

            e.printStackTrace();

        }

        return result1;

    }

    // 显示教师表中的数据

    public void show_teacher() throws IOException {

        System.out.println("查询到教师表中数据如下:");

        System.out.println("+----------+------------+----------+");

        System.out.println("|    id    |    name    |    age   |");

        System.out.println("+----------+------------+----------+");

        for (int i = 0; i < row1; i++) {

            System.out.printf("|%-10s|%-10s|%-10s|\n", result1[i][0], result1[i][1], result1[i][2]);

        }

        System.out.println("+----------+------------+----------+");

    }

    // 新建一个学生表

    public void create_student_table() throws IOException {

        try {

            String sql = "CREATE TABLE student(id INT PRIMARY KEY NOT NULL,name VARCHAR(20) NOT NULL,age INT NOT NULL)";

            state.executeUpdate(sql);

            System.out.println("MySQL创建学生表成功!");

        } catch (SQLException e) {

            e.printStackTrace();

            System.out.println("MySQL创建学生表失败!");

        }

    }

    // 向学生表中插入数据

    public void insert_student(int id, String name, int age) throws IOException {

        try {

            String sql = "INSERT INTO student(id,name,age) VALUES(" + id + ",'" + name + "'," + age + ")";

            state.executeUpdate(sql);

        } catch (SQLException e) {

            e.printStackTrace();

        }

    }

    // 删除学生表中的所有数据

    public void delete_student() throws IOException {

        try {

            String sql = "DELETE FROM student";

            state.executeUpdate(sql);

        } catch (SQLException e) {

            e.printStackTrace();

        }

    }

   

    // 查看学生表中的数据并以数组的形式保存每一行的数据

    public String[][] select_student() throws IOException {

        try {

            String sql = "SELECT * FROM student";

            ResultSet rs = state.executeQuery(sql);

            row2 = 0;

            while (rs.next()) {

                row2++;

            }

            result2 = new String[row2][3];

            rs.beforeFirst();

            int i = 0;

            while (rs.next()) {

                result2[i][0] = rs.getString("id");

                result2[i][1] = rs.getString("name");

                result2[i][2] = rs.getString("age");

                i++;

            }

        } catch (SQLException e) {

            e.printStackTrace();

        }

        return result2;

    }

    // 显示学生表中的数据

    public void show_student() throws IOException {

        System.out.println("查询到学生表中数据如下:");

        System.out.println("+----------+------------+----------+");

        System.out.println("|    id    |    name    |    age   |");

        System.out.println("+----------+------------+----------+");

        for (int i = 0; i < row2; i++) {

            System.out.printf("|%-10s|%-10s|%-10s|\n", result2[i][0], result2[i][1], result2[i][2]);

        }

        System.out.println("+----------+------------+----------+");

    }

}

  1. 新建一个包,实现实验两个数据库间的数据转移的操作:
    • 新建一个main包,并在该包下新建一个main类:

    •  编写java代码:

package main;

import java.io.IOException;

import java.sql.SQLException;

import JDBC.*;

public class main {

    public static void main(String[] args) throws IOException, SQLException {

        // 与库建立连接

        sql_jdbc DB1 = new sql_jdbc();

        mysql_jdbc DB2 = new mysql_jdbc();

        DB1.insert();

        DB2.insert();

        // 初始化数据库,删除数据库两个表再新建表

        sql_op op1 = new sql_op();

        mysql_op op2 = new mysql_op();

        op1.set_state(DB1);

        op1.init();

        op2.set_state(DB2);

        op2.init();

        op1.create_teacher_table();

        op1.create_student_table();

        op2.create_teacher_table();

        op2.create_student_table();

        // sql server数据库表中插入数据

        op1.insert_teacher(1, "张三", 20);

        op1.insert_teacher(2, "李四", 21);

        op1.insert_teacher(3, "王五", 22);

        op1.insert_teacher(4, "赵六", 23);

        op1.insert_teacher(5, "孙七", 24);

        op1.insert_student(1, "学一", 20);

        // mysql数据库表中插入数据

        op2.insert_teacher(1, "张三", 20);

        op2.insert_student(1, "学一", 20);

        op2.insert_student(2, "学二", 21);

        op2.insert_student(3, "学三", 22);

        op2.insert_student(4, "学四", 23);

        op2.insert_student(5, "学五", 24);

        // 第一步、查看两个数据表的表以及表中的数据

        System.out.println("************************************************************");

        System.out.println("第一步、查看两个数据库的表以及表中的数据:");

        op1.show_tables();

        op1.select_teacher();

        op1.show_teacher();

        op1.select_student();

        op1.show_student();

        op2.show_tables();

        op2.select_teacher();

        op2.show_teacher();

        op2.select_student();

        op2.show_student();

        System.out.println("************************************************************");

        // 第二步,将sql server数据库教师表中的数据插入mysql数据库中

        System.out.println("第二步,将sql server数据库教师表中的数据插入mysql数据库中:");

        op2.delete_teacher();

        for (int i = 0;i <op1.row1 ; i++) {

            int a=Integer.parseInt(op1.result1[i][0]);

            int b=Integer.parseInt(op1.result1[i][2]);

            op2.insert_teacher(a,op1.result1[i][1],b);

        }

        System.out.println("数据转移成功!");

        System.out.println("************************************************************");

        // 第三步,将mysql数据库中学生表中的数据插入sql server数据库

        System.out.println("第三步,将mysql数据库中学生表中的数据插入sql server数据库:");

        op1.delete_student();

        for (int i = 0;i <op2.row2 ; i++) {

            int a=Integer.parseInt(op2.result2[i][0]);

            int b=Integer.parseInt(op2.result2[i][2]);

            op1.insert_student(a,op2.result2[i][1],b);

        }

        System.out.println("数据转移成功!");

        System.out.println("************************************************************");

        // 第四步、查看两个数据表的表以及表中的数据,验证是否转移成功

        System.out.println("第四步、查看两个数据库的表以及表中的数据,验证是否转移成功:");

        op1.show_tables();

        op1.select_teacher();

        op1.show_teacher();

        op1.select_student();

        op1.show_student();

        op2.show_tables();

        op2.select_teacher();

        op2.show_teacher();

        op2.select_student();

        op2.show_student();

        System.out.println("************************************************************");

        // 第五步、断开与数据库的连接

        DB1.disconnect();

        DB2.disconnect();

    }

}

  1. 编译结果:
    • 连接并初始化两个数据库:

    • 第一步、查看两个数据库的表以及表中的数据:

    • 第二步,将sql server数据库教师表中的数据插入mysql数据库中:

    • 第三步,将mysql数据库中学生表中的数据插入sql server数据库:

    • 第四步、查看两个数据表的表以及表中的数据,验证是否转移成功:

    • 分别在SQL server数据库和MySQL数据库管理系统上验证结果:

SQL server数据库:

MySQL数据库:

数据库数据转移成功!

出现的问题:

  • 问题一:

com.microsoft.sqlserver.jdbc.SQLServerException: 通过端口 1433 连接到主机 localhost 的 TCP/IP 连接失败。

  • 问题二:

驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接。

解决方案:

  • 问题一:

检查SQL Server 配置的是否为1433端口(注意TCP动态端口由原来的0改为空,禁用动态端口)、以及TCP/IP协议是否启动

  • 问题二:

在URL处加个 trust 参数信任证书 :
TrustServerCertificate=true;

实验心得:

  

通过本次实验,我认识到了JDBC(Java数据库连接)接口功能的强大性,它可以将复杂的SQL语句嵌套在编程函数中。JDBC 为工具/数据库开发人员提供了一个标准的API,使他们能够用纯Java API 来编写数据库应用程序。即使像MySQL和SQL server,他们的接口并不完全相同,但也可以通过JDBC进行数据库数据转移。

同时,通过本次实验,对Java编程能力和SQL语句编写能力都有所提高。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

我是蒸饺吖~

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

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

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

打赏作者

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

抵扣说明:

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

余额充值