Мигрирайте ResultSet между две MySQL таблици, без да посочвате колони в Java

Имам MySQL база данни на сървър #1 и трябва да я мигрирам към сървър #2. Базата данни е много голяма и методи като mysqldump или MySQL Workbench Migration не работеха за мен, така че исках да напиша мое собствено Java приложение, което да изпълнява следните стъпки:

  1. вземете всички имена на таблици от схемата на изходната база данни
  2. за всяка таблица ще избере партида от записи (да кажем 10 000 наведнъж) и ще ги вмъкне в съответната таблица в целевата база данни. Схемата вече е подготвена с правилно дефинирани таблици.
  3. повторете, докато не останат редове за текущата таблица.
  4. повторете за всяка маса.

Проблемът е, AFAIK, когато се използва JDBC, е необходимо да се премине през ResultSet и да се уточнят всички типове и имена на колони, като това:

while (resultset.next()) {                      
    System.out.println(resultset.getString("Col 1"));
    System.out.println(resultset.getString("Col 2"));
    System.out.println(resultset.getString("Col 3"));                    
    System.out.println(resultset.getString("Col n"));
}

Искам да направя това за всички таблици и всичките им колони, без да посочвам техните имена и типове ръчно. Не мога просто да напиша ръчно всички тези колони, тъй като имам 150 таблици и всяка от тях има около 10-50 колони.

Има ли някакъв общ начин как да направите това? Може би да се възползвате от факта, че схемите на източника и местоназначението са еднакви (едни и същи таблици с едни и същи имена/типове на колони и едни и същи външни ключове)?


person P. Paul    schedule 01.02.2021    source източник
comment
Какво не е наред с mysqldump? В много големи бази данни обикновено искате да използвате помощни програми, а не миграция ред по ред...   -  person Marmite Bomber    schedule 01.02.2021


Отговори (2)


Можете да използвате ResultSetMetaData с ResultSet, за да получите имената на колоните, броя на колоните и няколко други подробности.

ResultSet resultSet = ps.executeQuery();  
ResultSetMetaData resultSetMetaData = resultSet.getMetaData();

while (resultSet.next()) {
    for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
        System.out.println(resultSet.getString(i));
    }
}

ако трябва също да извлечете типа колона, за да вземете решение, можете да използвате Switch условия въз основа на типа, върнат от resultSetMetaData.getColumnTypeName(i) за използване на нещо като

  • resultSet.getString()
  • resultSet.getInt()
  • resultSet.getBoolean()
  • resultSet.getDate()
  • Много повече
person Koushlendra    schedule 01.02.2021
comment
И за да получите списъка с таблици, можете да използвате conn.getMetaData(). - person The Impaler; 01.02.2021

В допълнение към отговора на @koushlendra можете също да използвате тези методи за допълнителна информация (ако е необходимо)

  1. resultSetMetaData.getTableName(int column) Връща името на таблицата на колоната.

  2. resultSetMetaData.getSchemaName(int column) Връща името на схемата на таблицата на колоната.

person Saurabha    schedule 01.02.2021