今天在一老项目中实现一个修改前先备份的功能,为了实现表间数据复制,我编写一个通用的工具类,支持动态选择要复制的表、列以及筛选条件。这样可以大大提高代码的重用性和灵活性。
核心实现代码
我们首先来看看核心的实现代码,并逐步解释每一部分的功能。
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 + ")";
}
代码解析
-
copyTableData
方法:- 这是工具类的核心方法,通过传递源表名、目标表名、要复制的列名列表、过滤条件以及数据库连接信息,你可以将源表中符合条件的数据复制到目标表。
whereClause
参数允许你指定一个WHERE
子句来筛选要复制的数据。
- 这是工具类的核心方法,通过传递源表名、目标表名、要复制的列名列表、过滤条件以及数据库连接信息,你可以将源表中符合条件的数据复制到目标表。
-
buildSelectSQL
方法:- 用于生成
SELECT
SQL 语句,该语句从源表中选择指定的列。如果指定了whereClause
,则会将其附加到SELECT
语句中。
- 用于生成
-
buildInsertSQL
方法:- 用于生成
INSERT
SQL 语句,该语句将数据插入到目标表中。列名和占位符的数量和顺序与SELECT
语句保持一致。
- 用于生成
-
main
方法:- 提供了一个示例,展示了如何使用该工具类将特定条件的数据从表A复制到表B。你可以根据实际需求调整参数。
结语
通过本文介绍的工具类,你可以在Java中轻松实现任意表之间的数据复制,并灵活地指定要复制的数据。无论是数据迁移、备份、同步,还是临时数据处理,这个工具类都可以满足你的需求。希望你能将其应用到实际项目中,提升开发效率。
希望这篇博客对你有帮助!如果你有任何问题或建议,欢迎私信或评论区留言。