在Java中使用JDBC实现表间数据复制:支持灵活的过滤条件

今天在一老项目中实现一个修改前先备份的功能,为了实现表间数据复制,我编写一个通用的工具类,支持动态选择要复制的表、列以及筛选条件。这样可以大大提高代码的重用性和灵活性。

核心实现代码

我们首先来看看核心的实现代码,并逐步解释每一部分的功能。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.List;

public class TableCopyUtil {
	
	
    public static void main(String[] args) {
        // 数据库连接信息
        String jdbcUrl = "jdbc:mysql://localhost:3306/xxx";//xxx替换你数据库
        String username = "username";
        String password = "password ";

        // 要复制的列名列表
        List<String> columns = List.of("id", "username", "password");

        // 定义过滤条件,只复制满足条件的数据
        String whereClause = "id = '1'";

        // 调用工具方法,将数据从A表复制到B表
        copyTableData("user", "user_info", columns, whereClause, jdbcUrl, username, password);
    }

    /**
     * 复制源表的指定数据到目标表。
     * 
     * @param sourceTable 源表的名称
     * @param targetTable 目标表的名称
     * @param columns     要复制的列名列表
     * @param whereClause 过滤条件的 WHERE 子句(例如 "column1 = 'value'"),可为空
     * @param jdbcUrl     JDBC连接URL
     * @param username    数据库用户名
     * @param password    数据库密码
     */
    public static void copyTableData(String sourceTable, String targetTable, List<String> columns, String whereClause, String jdbcUrl, String username, String password) {
        // 构造从源表选择数据的SELECT SQL语句
        String selectSQL = buildSelectSQL(sourceTable, columns, whereClause);
        // 构造插入数据到目标表的INSERT SQL语句
        String insertSQL = buildInsertSQL(targetTable, columns);

        // 使用try-with-resources自动管理资源(连接和语句)
        try (Connection conn = DriverManager.getConnection(jdbcUrl, username, password);
             PreparedStatement selectStmt = conn.prepareStatement(selectSQL);
             PreparedStatement insertStmt = conn.prepareStatement(insertSQL)) {

            // 执行SELECT语句,获取结果集
            ResultSet rs = selectStmt.executeQuery();

            // 遍历结果集
            while (rs.next()) {
                // 对于每一行数据,根据列列表设置INSERT语句的参数
                for (int i = 0; i < columns.size(); i++) {
                    insertStmt.setObject(i + 1, rs.getObject(columns.get(i)));
                }
                // 执行INSERT语句,将数据插入到目标表中
                insertStmt.executeUpdate();
            }

            System.out.println("Data copied successfully from " + sourceTable + " to " + targetTable + "!");

        } catch (Exception e) {
            // 捕获和打印任何异常
            e.printStackTrace();
        }
    }

    /**
     * 构造SELECT SQL语句,用于从源表中选择指定列的数据。
     * 
     * @param table       表名
     * @param columns     列名列表
     * @param whereClause 过滤条件的 WHERE 子句,可为空
     * @return SELECT SQL语句
     */
    private static String buildSelectSQL(String table, List<String> columns, String whereClause) {
        // 将列名列表连接成字符串,用逗号分隔
        String columnList = String.join(", ", columns);
        // 构造基本的SELECT SQL语句:"SELECT column1, column2 FROM table"
        String sql = "SELECT " + columnList + " FROM " + table;
        // 如果有WHERE条件,则附加到SQL语句中
        if (whereClause != null && !whereClause.trim().isEmpty()) {
            sql += " WHERE " + whereClause;
        }
        return sql;
    }

    /**
     * 构造INSERT SQL语句,用于将数据插入到目标表中。
     * 
     * @param table   表名
     * @param columns 列名列表
     * @return INSERT SQL语句
     */
    private static String buildInsertSQL(String table, List<String> columns) {
        // 将列名列表连接成字符串,用逗号分隔
        String columnList = String.join(", ", columns);
        // 创建一个与列数相同的占位符列表,形如"?, ?, ?"
        String placeholders = String.join(", ", columns.stream().map(col -> "?").toArray(String[]::new));
        // 构造SQL语句:"INSERT INTO table (column1, column2) VALUES (?, ?)"
        return "INSERT INTO " + table + " (" + columnList + ") VALUES (" + placeholders + ")";
    }

代码解析

  1. copyTableData 方法

    • 这是工具类的核心方法,通过传递源表名、目标表名、要复制的列名列表、过滤条件以及数据库连接信息,你可以将源表中符合条件的数据复制到目标表。whereClause 参数允许你指定一个 WHERE 子句来筛选要复制的数据。
  2. buildSelectSQL 方法

    • 用于生成 SELECT SQL 语句,该语句从源表中选择指定的列。如果指定了 whereClause,则会将其附加到 SELECT 语句中。
  3. buildInsertSQL 方法

    • 用于生成 INSERT SQL 语句,该语句将数据插入到目标表中。列名和占位符的数量和顺序与 SELECT 语句保持一致。
  4. main 方法

    • 提供了一个示例,展示了如何使用该工具类将特定条件的数据从表A复制到表B。你可以根据实际需求调整参数。

结语

通过本文介绍的工具类,你可以在Java中轻松实现任意表之间的数据复制,并灵活地指定要复制的数据。无论是数据迁移、备份、同步,还是临时数据处理,这个工具类都可以满足你的需求。希望你能将其应用到实际项目中,提升开发效率。


希望这篇博客对你有帮助!如果你有任何问题或建议,欢迎私信或评论区留言。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值