Создание объектов класса из результатов запроса в Java - PullRequest
0 голосов
/ 12 декабря 2018

Я потратил впустую часы, пытаясь найти решение для этого, но я не мог.Я получил 3 класса:

База данных, таблица и столбец:

public class Database {
    private List<Table> table;
    private String name; ...

public class Table {
    private String name;
    private List<Column> column; ...


public class Column {
    private String columnName;
    private String dataType;
    private int data_length; ...

Следующий запрос дает мне информацию, которую я хочу использовать для создания новых объектов.

SELECT TABLE_NAME, COLUMN_NAAM, DATA_TYPE, DATA_LENGTH FROM USER_TAB_COLUMNS;

OUTPUT:

TABLE_NAME                     COLUMN_NAME                    DATA_TYPE  DATA_LENGTH
------------------------------ ------------------------------ --------- -----------
DONATIE                        PROJECTID                      NUMBER     22
DONATIE                        KLANTID                        NUMBER     22
DONATIE                        DONATIEDATUM                   DATE       7
DONATIE                        BEDRAG                         NUMBER     22
DONATIE                        DONATIEID                      NUMBER     22
KLANT                          ROL                            VARCHAR2   10
KLANT                          WACHTWOORD                     VARCHAR2   30
KLANT                          GEBRUIKERSNAAM                 VARCHAR2   30
KLANT                          TELEFOONNUMMER                 NUMBER     22
KLANT                          EMAIL                          VARCHAR2   30
KLANT                          WOONPLAATS                     VARCHAR2   15
KLANT                          POSTCODE                       VARCHAR2   6
KLANT                          HUISNUMMER                     VARCHAR2   5
KLANT                          ADRES                          VARCHAR2   30
KLANT                          GESLACHT                       VARCHAR2   5

Я использую следующий код для выполнения запроса:

    public Database getTargetDbStructure(String username, String password, String url, String dbName) {
        Database db = new Database();
        db.setName(dbName);
        List<Table> tableStructureList = new ArrayList<Table>();
        try (Connection con = super.getConnectionTargetDb(username, password, url)) {
            String query = "SELECT DISTINCT(TABLE_NAME) FROM USER_TAB_COLUMNS";
            PreparedStatement pstmt = con.prepareStatement(query);
            ResultSet rs = pstmt.executeQuery();


            while (rs.next()){
                String query2 = "SELECT COLUMN_NAME, DATA_TYPE, DATA_LENGTH FROM USER_TAB_COLUMNS WHERE TABLE_NAME = ?";
                PreparedStatement pstmt2 = con.prepareStatement(query2);
                String tableName = rs.getString("TABLE_NAME");
                pstmt2.setString(1, tableName);
                ResultSet rs2 = pstmt.executeQuery();
                Table t = new Table();
                t.setName(tableName);

                System.out.println("1");
                while (rs2.next()){
                    System.out.println("2");
                    String column_name = rs2.getString("COLUMN_NAAM");
                    String data_type = rs2.getString("DATA_TYPE");
                    int data_length = rs2.getInt("DATA_LENGTH");
                    Column column = new Column();
                    column.setColumnName(column_name);
                    column.setDataType(data_type);
                    column.setData_length(data_length);
                    t.addColumn(column);
                }
                db.addTable(t);
                tableStructureList.add(t);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }

        return db;
    }

Что ж, Java для меня новинка, я пытаюсь узнать, как вы можете видеть.Код, который должен выполнить запрос, не работает.Должен быть намного лучший способ вместо запуска набора результатов в наборе результатов.Я пытался создать новые объекты таблицы и добавить их непосредственно в список таблиц, но проблема в том, что у меня будет для каждого объекта таблицы только один столбец.Я хочу заархивировать следующую структуру:

DATABASE
    DONATIE
        PROJECTID
        KLANTID
        DONATIEDATUM
        BEDRAGDONATIEID
    KLANT
        ROL
        WACHTWOORD
        GEBRUIKERSNAAM
        ETC..
    TABLE3
        ETC...

Таким образом, один простой объект базы данных должен содержать эти вещи.Может кто-нибудь помочь мне, пожалуйста.Заранее спасибо

1 Ответ

0 голосов
/ 13 декабря 2018

Я бы не открывал одновременно два объекта ResultSet, так как вы наблюдаете за собой, я вижу здесь два альтернативных решения.полностью, добавляя все таблицы к tableStructureList, а затем, когда вы закончите с первым запросом, вы можете перейти ко второму, но вместо этого переберите tableStructureList, чтобы получить таблицу для использования.

Вторая альтернатива - объединить два запроса в один и зациклить набор результатов, сравнивая имя таблицы для текущей строки с предыдущей, и, если она не совпадает, то создайте новый объект Table и добавьтестолбец из строки в эту таблицу, а затем продолжайте с этим, пока имя таблицы снова не изменится.Чтобы это работало, вам нужно изменить второй запрос, чтобы он включал TABLE_NAME в предложении SELECT и сортировал его по TABLE_NAME, поэтому SELECT TABLE_NAME, ...(same as before)... ORDER BY TABLE_NAME

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...