Java实现从一个数据库表复制到另一个数据库表

引言

在现代的软件开发中,数据库是一个非常重要的组成部分。数据库表之间的数据迁移和复制是常见的操作,特别是在不同的数据库之间。本文将介绍如何使用Java实现从一个数据库表复制数据到另一个数据库表。

准备工作

在开始之前,我们需要准备以下几个方面的内容:

  1. 两个数据库的连接信息:包括数据库的URL、用户名和密码。
  2. 数据库驱动:根据使用的数据库,需要下载并引入相应的数据库驱动。

本文以MySQL数据库为例进行演示,相关的代码示例也是基于MySQL数据库。

数据库连接

首先,我们需要建立与两个数据库的连接。在Java中,我们可以使用java.sql包提供的Connection类来实现。下面是一个示例代码:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class DatabaseConnection {
    private final String url;
    private final String username;
    private final String password;
    private Connection connection;

    public DatabaseConnection(String url, String username, String password) {
        this.url = url;
        this.username = username;
        this.password = password;
    }

    public void connect() throws SQLException {
        connection = DriverManager.getConnection(url, username, password);
    }

    public Connection getConnection() {
        return connection;
    }

    public void close() throws SQLException {
        if (connection != null) {
            connection.close();
        }
    }
}

在该示例代码中,我们封装了一个DatabaseConnection类来处理数据库的连接。其中,connect方法用于连接数据库,getConnection方法用于获取连接对象,close方法用于关闭连接。

数据表复制

接下来,我们需要编写代码来实现从一个数据库表复制数据到另一个数据库表。下面是一个示例代码:

import java.sql.*;

public class TableCopy {
    private final DatabaseConnection sourceConnection;
    private final DatabaseConnection targetConnection;
    private final String sourceTable;
    private final String targetTable;

    public TableCopy(DatabaseConnection sourceConnection, DatabaseConnection targetConnection,
                     String sourceTable, String targetTable) {
        this.sourceConnection = sourceConnection;
        this.targetConnection = targetConnection;
        this.sourceTable = sourceTable;
        this.targetTable = targetTable;
    }

    public void copy() throws SQLException {
        try (Connection sourceConn = sourceConnection.getConnection();
             Connection targetConn = targetConnection.getConnection();
             Statement sourceStmt = sourceConn.createStatement();
             Statement targetStmt = targetConn.createStatement()) {

            ResultSet resultSet = sourceStmt.executeQuery("SELECT * FROM " + sourceTable);
            ResultSetMetaData metaData = resultSet.getMetaData();
            int columnCount = metaData.getColumnCount();

            String insertStatement = generateInsertStatement(metaData);

            while (resultSet.next()) {
                for (int i = 1; i <= columnCount; i++) {
                    Object value = resultSet.getObject(i);
                    targetStmt.setObject(i, value);
                }
                targetStmt.executeUpdate();
            }
        }
    }

    private String generateInsertStatement(ResultSetMetaData metaData) throws SQLException {
        StringBuilder sb = new StringBuilder();
        sb.append("INSERT INTO ").append(targetTable).append(" VALUES (");
        for (int i = 1; i <= metaData.getColumnCount(); i++) {
            sb.append("?,");
        }
        sb.deleteCharAt(sb.length() - 1);
        sb.append(")");
        return sb.toString();
    }
}

在该示例代码中,我们封装了一个TableCopy类来处理数据表的复制。其中,copy方法用于复制数据表,generateInsertStatement方法用于生成插入语句。

示例代码

下面是一个使用示例代码的示例:

public class Main {
    public static void main(String[] args) {
        // 创建源数据库连接
        DatabaseConnection sourceConnection = new DatabaseConnection("jdbc:mysql://localhost:3306/source_db",
                "username", "password");
        // 创建目标数据库连接
        DatabaseConnection targetConnection = new DatabaseConnection("jdbc:mysql://localhost:3306/target_db",
                "username", "password");

        try {
            // 连接源数据库
            sourceConnection.connect();
            // 连接目标数据库
            targetConnection.connect();

            // 创建数据表复制对象
            TableCopy tableCopy = new TableCopy(sourceConnection, targetConnection, "source_table", "target_table");
            // 复制数据表
            tableCopy.copy();

            System.out.println("数据表复制成功!");
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                // 关闭数据库连接
                sourceConnection.close();
                targetConnection.close();
            }