通过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)JDBC连接SQL Server
下载好的这三个jar包都行,如果选择高版本的会报错,可以换低版本的jar包: 导入jar包到项目:
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
导入jar包到项目:
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数据库关闭失败!"); } } }
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("+----------+------------+----------+"); } }
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("+----------+------------+----------+"); } }
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(); } }
SQL server数据库: MySQL数据库: 数据库数据转移成功! |
||||
出现的问题:
com.microsoft.sqlserver.jdbc.SQLServerException: 通过端口 1433 连接到主机 localhost 的 TCP/IP 连接失败。
驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接。 |
||||
解决方案:
检查SQL Server 配置的是否为1433端口(注意TCP动态端口由原来的0改为空,禁用动态端口)、以及TCP/IP协议是否启动
在URL处加个 trust 参数信任证书 : |
||||
实验心得: 通过本次实验,我认识到了JDBC(Java数据库连接)接口功能的强大性,它可以将复杂的SQL语句嵌套在编程函数中。JDBC 为工具/数据库开发人员提供了一个标准的API,使他们能够用纯Java API 来编写数据库应用程序。即使像MySQL和SQL server,他们的接口并不完全相同,但也可以通过JDBC进行数据库数据转移。 同时,通过本次实验,对Java编程能力和SQL语句编写能力都有所提高。 |