package cn.firegod.study.gdemo.migrate.db;
import lombok.Getter;
import lombok.Setter;
import javax.sql.DataSource;
import java.sql.*;
@Getter
@Setter
public class Doris2Ignite {
private DataSource from;
private DataSource to;
// 生成方法复制数据库中的表从from到to
// 生成方法复制数据库中的表从from到to
public void copyTable(String tableName) throws Exception {
try (Connection fromConnection = from.getConnection();
Connection toConnection = to.getConnection()) {
// 检查目标表是否存在
if (!isTableExists(toConnection, tableName)) {
// 创建表
createTable(fromConnection, toConnection, tableName);
}
// 复制数据
copyData(fromConnection, toConnection, tableName);
}
}
private boolean isTableExists(Connection connection, String tableName) throws Exception {
DatabaseMetaData metaData = connection.getMetaData();
ResultSet resultSet = metaData.getTables(null, null, tableName, null);
return resultSet.next();
}
private void createTable(Connection fromConnection, Connection toConnection, String tableName) throws Exception {
// 获取源表的表结构
DatabaseMetaData fromMetaData = fromConnection.getMetaData();
ResultSet columns = fromMetaData.getColumns(null, null, tableName, null);
StringBuilder createTableSQL = new StringBuilder("CREATE TABLE " + tableName + " (");
boolean firstColumn = true;
while (columns.next()) {
if (!firstColumn) {
createTableSQL.append(", ");
}
String columnName = columns.getString("COLUMN_NAME");
String columnType = columns.getString("TYPE_NAME");
columnType = mapDorisTypeToIgniteType(columnType);
createTableSQL.append(columnName).append(" ").append(columnType);
firstColumn = false;
}
createTableSQL.append(")");
try (Statement statement = toConnection.createStatement()) {
statement.executeUpdate(createTableSQL.toString());
}
}
private String mapDorisTypeToIgniteType(String dorisType) {
switch (dorisType.toUpperCase()) {
case "TEXT":
return "VARCHAR";
case "DATETIME":
return "TIMESTAMP";
// 可以根据需要添加更多的类型映射
default:
return dorisType;
}
}
private void copyData(Connection fromConnection, Connection toConnection, String tableName) throws Exception {
String selectSQL = "SELECT * FROM " + tableName;
try (Statement fromStatement = fromConnection.createStatement();
ResultSet resultSet = fromStatement.executeQuery(selectSQL);
PreparedStatement preparedStatement = toConnection.prepareStatement(getInsertSQL(resultSet))) {
int batchSize = 1000;
int count = 0;
int columnCount = resultSet.getMetaData().getColumnCount();
while (resultSet.next()) {
for (int i = 1; i <= columnCount; i++) {
preparedStatement.setObject(i, resultSet.getObject(i));
}
preparedStatement.addBatch();
count++;
if (count % batchSize == 0) {
preparedStatement.executeBatch();
}
}
// 处理最后一批不足 batchSize 的数据
if (count % batchSize != 0) {
preparedStatement.executeBatch();
}
}
}
private String getInsertSQL(ResultSet resultSet) throws Exception {
int columnCount = resultSet.getMetaData().getColumnCount();
StringBuilder insertSQL = new StringBuilder("INSERT INTO " + resultSet.getMetaData().getTableName(1) + " VALUES (");
for (int i = 1; i <= columnCount; i++) {
if (i > 1) {
insertSQL.append(", ");
}
insertSQL.append("?");
}
insertSQL.append(")");
return insertSQL.toString();
}
}
了解 工作生活心情记忆 的更多信息
订阅后即可通过电子邮件收到最新文章。