您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

优化在JDBC上调用JTable的数据

优化在JDBC上调用JTable的数据

恕我直言,坏习惯的根源是您不必要地查询数据库的多重时间来获取所需的数据(列,行,行号,列号等):

获取列号:

ResultSet rs = stmt.executeQuery("SELECT * FROM " + tableName);

获取行号:

ResultSet rs = stmt.executeQuery("SELECT COUNT(*) FROM " + tableName);

获取行(这是最糟糕的原因,因为它在循环内):

data = stmt.executeQuery("SELECT " + columnName + " FROM " + tableName + " LIMIT " + j + ", " + 1);

只需查询数据库一次。单个ResultSet及其关联的ResultSetMetaData应该足以实现您的目标。另外,正如已经建议的那样,使用aSwingWorker在单独的线程中进行数据库调用。例如:

final JTable table = new JTable();

SwingWorker<Void, TableModel> worker = new SwingWorker<Void, TableModel> () {

    @Override
    protected Void doInBackground() throws Exception {

        ResultSet resultSet = stmt.executeQuery("SELECT * FROM " + tableName);
        ResultSetMetaData MetaData = resultSet.getMetaData();

        int columnCount = MetaData.getColumnCount(); // columns number
        String[] columnNames = new String[columnCount];
        for (int i = 1; i <= columnCount; i++) {
            columnNames[i] = MetaData.getColumnName(i); // fill columns names
        }

        resultSet.last();
        int rowCount = resultSet.getRow(); // get rows number
        resultSet.beforeFirst();

        Object[][] data = new Object[rowCount][columnCount];
        int currentRow = 0;
        while (resultSet.next()) {
            for (int currentColumn = 1; currentColumn <= columnCount; currentColumn++) {
                data[currentRow][currentColumn - 1] = resultSet.getObject(currentColumn); // fill data set
             }
             currentRow++;
        }

        TableModel model = new DefaultTableModel(data, columnNames);
        publish(model);

        return null;
    }

    @Override
    protected void process(List<TableModel> chunks) {
        TableModel model = chunks.get(0);
        table.setModel(model);
    }
}

worker.execute();
其他 2022/1/1 18:15:22 有457人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶