使用豆包生成的一段复制DORIS数据到IGNITE的代码

0
(0)
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();
    }


}

这篇文章有用吗?

平均评分 0 / 5. 投票数: 0

到目前为止还没有投票!成为第一位评论此文章。

很抱歉,这篇文章对您没有用!

让我们改善这篇文章!

告诉我们我们如何改善这篇文章?


了解 工作生活心情记忆 的更多信息

订阅后即可通过电子邮件收到最新文章。