import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.sql.*; @Service public class DBService { private static Logger LOG = LoggerFactory.getLogger(DBService.class); @Autowired private DBProperties dbProperties; public String dump(String data){ if(StringUtils.isBlank(data)){ LOG.info("--------data is null---"); return null; } String[] ss = data.split("\\."); if(ss == null || ss.length < 3){ LOG.info("--------ss size < 3---"); return null; } String db = ss[0]; String schemaName = ss[1]; String tableName = ss[2]; String newTableName = tableName + "_" + SnowflakeUtil.getUniqueId(); try { // 连接到源数据库 Connection sourceConnection = DriverManager.getConnection(dbProperties.getUrl(), dbProperties.getUsername(), dbProperties.getPassword()); // 连接到目标数据库 Connection targetConnection = DriverManager.getConnection(dbProperties.getUrl(), dbProperties.getUsername(), dbProperties.getPassword()); // 获取源表的元数据(结构信息) DatabaseMetaData metaData = sourceConnection.getMetaData(); ResultSet columns = metaData.getColumns(null, schemaName, tableName, null); // 构建创建表的SQL语句 StringBuilder createTableSql = new StringBuilder(); createTableSql.append("CREATE TABLE ").append(schemaName + "." + newTableName).append(" ("); while (columns.next()) { String columnName = columns.getString("COLUMN_NAME"); String dataType = columns.getString("TYPE_NAME"); int columnSize = columns.getInt("COLUMN_SIZE"); int nullable = columns.getInt("NULLABLE"); if(dataType.contains("int") || dataType.contains("st_geometry") || dataType.contains("timestamp") || dataType.contains("date")){ createTableSql.append(columnName).append(" ").append(dataType); }else { createTableSql.append(columnName).append(" ").append(dataType).append("(").append(columnSize).append(")"); } if (nullable == DatabaseMetaData.columnNoNulls) { createTableSql.append(" NOT NULL"); } createTableSql.append(","); } createTableSql.deleteCharAt(createTableSql.length() - 1); // 移除最后一个逗号 createTableSql.append(")"); // 执行创建表的SQL语句 Statement createTableStmt = targetConnection.createStatement(); createTableStmt.executeUpdate(createTableSql.toString()); // 复制表数据 String copyDataSql = "INSERT INTO " + schemaName + "." + newTableName + " SELECT * FROM " + schemaName + "." + tableName; Statement copyDataStmt = targetConnection.createStatement(); copyDataStmt.executeUpdate(copyDataSql); // 关闭连接和资源 copyDataStmt.close(); createTableStmt.close(); columns.close(); sourceConnection.close(); targetConnection.close(); LOG.info("----success---"); return db + "." + schemaName + "." + newTableName; } catch (SQLException e) { e.printStackTrace(); } return null; } //恢复数据 public boolean restore(String targetData, String data){ if(StringUtils.isBlank(data) || StringUtils.isBlank(targetData)){ LOG.info("--------data or targetData is null---"); return false; } String[] dataSS = data.split("\\."); if(dataSS == null || dataSS.length < 3){ LOG.info("--------dataSS size < 3---"); return false; } String[] targetDataSS = targetData.split("\\."); if(targetDataSS == null || targetDataSS.length < 3){ LOG.info("--------targetDataSS size < 3---"); return false; } try { // 连接到目标数据库 Connection targetConnection = DriverManager.getConnection(dbProperties.getUrl(), dbProperties.getUsername(), dbProperties.getPassword()); String targetSchemaName = targetDataSS[1]; String targetTableName = targetDataSS[2]; String schemaName = dataSS[1]; String tableName = dataSS[2]; //删除数据 String deleteSql = "delete from " + targetSchemaName + "." + targetTableName; Statement deleteDataStmt = targetConnection.createStatement(); deleteDataStmt.executeUpdate(deleteSql); // 关闭连接和资源 deleteDataStmt.close(); // 复制表数据 String copyDataSql = "INSERT INTO " + targetSchemaName + "." + targetTableName + " SELECT * FROM " + schemaName + "." + tableName; Statement copyDataStmt = targetConnection.createStatement(); copyDataStmt.executeUpdate(copyDataSql); // 关闭连接和资源 copyDataStmt.close(); return true; }catch (SQLException e) { e.printStackTrace(); } return false; } //执行 delete,删除表等操作 public boolean commitSql(String sql){ if(StringUtils.isBlank(sql)){ return true; } try { // 连接到目标数据库 Connection connection = DriverManager.getConnection(dbProperties.getUrl(), dbProperties.getUsername(), dbProperties.getPassword()); // 执行删除表的SQL语句 Statement statement = connection.createStatement(); statement.executeUpdate(sql); // 关闭连接和资源 statement.close(); connection.close(); return true; }catch (SQLException e) { e.printStackTrace(); } return false; } }