Java 高效地从H2数据库检索数据

Java 高效地从H2数据库检索数据,java,sql,database,swing,h2,Java,Sql,Database,Swing,H2,在我当前的项目中,我使用一个H2数据库来存储来自JTable的数据,以精确地表示TableModel的数据 我已经编写了保存表中所有列的代码,现在我想再次从数据库中检索数据 到目前为止还不错,但我想不出任何好的方法从数据库中检索数据并对其进行润色,使其能够再次添加到我的表中。 我有一种方法可以让我的表添加一个新行,其中包含所有列的数据,这样就没有问题了,比如public void addRowObject dataForFirstCol,Object dataForSecondCol[…],但我

在我当前的项目中,我使用一个H2数据库来存储来自JTable的数据,以精确地表示TableModel的数据

我已经编写了保存表中所有列的代码,现在我想再次从数据库中检索数据

到目前为止还不错,但我想不出任何好的方法从数据库中检索数据并对其进行润色,使其能够再次添加到我的表中。 我有一种方法可以让我的表添加一个新行,其中包含所有列的数据,这样就没有问题了,比如public void addRowObject dataForFirstCol,Object dataForSecondCol[…],但我需要逐行获取数据。使用H2/JavaSQL怎么可能做到这一点

我发现ResultSet对此很有帮助,但我仍然需要通过SQL逐行获取数据,而类似于从SOMEDATABASE中选择*之类的东西不会有多大帮助

我真的很感激一些帮助我开始,目前我 除了请求列A的所有数据外,别无选择,全部添加 将必要的行添加到表中,并为 那一列一行接一行。然后请求B列的数据,并添加 这是一行一行到B列的表格。在我看来,这通常是 这是一个可能的解决方案,但添加一个完整的行将更令人满意 而且最有可能的方式是在数千行中更有效

编辑:这是我用来创建和保存数据库的代码。不过,DROP查询只是出于测试目的

/**
 * Save tables content into H2 database
 * @param filename of the database
 * @param table to get the contents from
 */
public void save(File filename, JTable table) {

    // prevent saving when user is editing a cell
    if (table.isEditing()) { 
        table.getCellEditor().stopCellEditing();
    }

    try {
        Class.forName("org.h2.Driver");
        System.out.println(filename.toString());
        Connection conn = DriverManager.getConnection("jdbc:h2:" + filename.toString(), "sa", "");
        Statement state = conn.createStatement();

        state.execute("DROP TABLE IF EXISTS TASKS");

        state.execute("CREATE TABLE TASKS ("
                + "SeqNumber INT PRIMARY KEY,"
                + "FBNumber INT,"
                + "ReportNumber INT,"
                + "BetraNumber INT,"
                + "Date varchar(255),"
                + "StationName varchar(255)," 
                + "Kilometrage varchar(255),"
                + "BlockTime varchar(255),"
                + "WorkTime INT,"
                + "Worker varchar(255),"
                + "Task varchar(255),"
                + "Comments varchar(255),"
                + "ClosedState BOOLEAN," + ")"
                );

        String sqlInsert = "INSERT INTO TASKS " 

                + "(SeqNumber, "
                + "FBNumber, "
                + "ReportNumber, "
                + "BetraNumber, "
                + "Date, "
                + "StationName, "
                + "Kilometrage, "
                + "BlockTime, " 
                + "WorkTime, "
                + "Worker, "
                + "Task, "
                + "Comments, "
                + "ClosedState) "

        + "VALUES" 
        + "(?" // SeqNumber
        + ",?" // FBNumber
        + ",?" // ReportNumber
        + ",?" // BetraNumber
        + ",?" // Date
        + ",?" // StationName
        + ",?" // Kilometrage
        + ",?" // BlockTime
        + ",?" // WorkTime
        + ",?" // Worker
        + ",?" // Task
        + ",?" // Comments
        + ",?)"; // ClosedState

        for (int rowIndex = 0; rowIndex < table.getModel().getRowCount(); rowIndex++) {

            PreparedStatement sqlState = conn.prepareStatement(sqlInsert);

            sqlState.setInt(COLUMN_SEQ_NUMBER, getSeqNumber(table, rowIndex));
            sqlState.setInt(COLUMN_FB_NUMBER, getFBNumber(table, rowIndex));
            sqlState.setInt(COLUMN_REPORT_NUMBER, getRepNumber(table, rowIndex));
            sqlState.setInt(COLUMN_BETRA_NUMBER, getBetraNumber(table, rowIndex));

            sqlState.setString(COLUMN_DATE, getDate(table, rowIndex));
            sqlState.setString(COLUMN_STATION_NAME, getStationName(table, rowIndex));
            sqlState.setString(COLUMN_KILOMETRAGE, getKilometrage(table, rowIndex));
            sqlState.setString(COLUMN_BLOCK_TIME, getBlockTime(table, rowIndex));

            sqlState.setInt(COLUMN_WORK_TIME, getWorkTime(table, rowIndex));

            sqlState.setString(COLUMN_WORKER, getWorker(table, rowIndex));
            sqlState.setString(COLUMN_TASK, getTask(table, rowIndex));
            sqlState.setString(COLUMN_COMMENTS, getComments(table, rowIndex));
            sqlState.setBoolean(COLUMN_CLOSED_STATE, getClosedState(table, rowIndex));

            sqlState.executeUpdate();
        }

        // This is also just temporary code to see the contents
        ResultSet dbContent = conn.createStatement().executeQuery("SELECT * FROM TASKS");
        while(dbContent.next()) {
            for (int i = 1; i+1 < DBDatabaseSystem.table.getColumnCount(); i++) {
                System.out.println(dbContent.getString(i));
            }
        }

        conn.close();
        unsavedChanges = false;

    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        DBDatabaseSystem.infoSystem.addError("Es gab ein SQL Problem beim Speichern der Datenbank");
    } 


}
您询问有关检索到Jtable的信息,并包括用于保存和简单打印的代码

以下是一些理论观点:

显示来自数据库的GUI数据可能意味着有很多行。GUI swing Jtable、SWT表、web等在开始时显示在100行以下。我认为你应该把这些行放在开头。 接口公共接口TableModel以检索惰性或 网络实现中存在动态或分页这样的词,不幸的是,我不知道官方支持/实现。谷歌展示了一些,我不知道它们是好是坏。 几乎所有的推进都必须从…中选择计数*。。。到 实现getRowCount;然后使用norportable sql子句获取数据, 在H2中阅读有关此语法的信息,选择*。。。限制偏移以获得具体行。这个问题我不太清楚,但你们可能知道这个想法?
编辑:第二部分是关于垂直维度这个问题对我来说很难,我不是以英语为母语的人。如果您考虑水平维度,通常我会将一行中的所有对象列从ResultSet行映射到Map

为什么您说从SOMETABLE中选择*对您没有帮助?您的数据库表是如何设计的?Ohh犯了一个错误,从某个数据库中选择*当前,我的所有数据都存储在一个数据库中,其中包含一个表。web上可能有一些关于搜索结果集tablemodel的ResultSetTableModel源代码。如果您编辑了问题并添加了数据库表结构,将更有效率,JTable结构,您用来保存它的代码,等等。目前它都相当模糊。