Как загрузить точное количество строк в jTable из MySQL и разбить оставшиеся страницы? - PullRequest
0 голосов
/ 20 апреля 2019

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

Этот метод загружаетданные в таблицу:


public void showTable(){
        try{ 

            how.res = how.stat.executeQuery("select * from students order by name ASC limit 100");

            while(how.res.next()){
                String id = how.res.getString(1);
                String name = how.res.getString(2);
                String contact = how.res.getString(3);

                Object[] content = {id,name,contact};
                DefaultTableModel model = (DefaultTableModel)jTable1.getModel();
                model.addRow(content);

            }
        }catch (Exception e){

        }
    }

Я вызываю этот метод при инициализации формы, и теперь я получаю только 100 строк в таблицу, что я должен написать для следующей кнопки, чтобы загрузить следующие 100 строк и обновить таблицу?

Что я пробовал:


private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        // TODO add your handling code here:
        try{ 
            numClick+=100;
            how.res = how.stat.executeQuery("select * from students offset"+numClick+"");

            while(how.res.next()){
                String id = how.res.getString(1);
                String name = how.res.getString(2);
                String contact = how.res.getString(3);

                Object[] content = {id,name,contact};
                DefaultTableModel model = (DefaultTableModel)jTable1.getModel();
                model.addRow(content); 
            }
        }catch (Exception e){

        }  
    } 

Но это не дает мне никакого результата.

Вот соединение:

public class JoinConnection {

    public Connection con;
    public Statement stat;
    public ResultSet res;

    public JoinConnection(){

        systemConnection();
    }

    public void systemConnection(){
        try{
        Class.forName("com.mysql.jdbc.Driver");
        con =(com.mysql.jdbc.Connection) DriverManager.getConnection("jdbc:mysql://localhost:3306/library","root","");
                stat = (Statement) con.createStatement();
        }catch(ClassNotFoundException | SQLException e){System.out.println(e);}
    }
} 

IЯ использую NetBeans с MySQL.если вопрос не ясен, скажите, пожалуйста, для разъяснения.

РЕДАКТИРОВАТЬ: Благодаря @ Джорджу З. Мы решили проблему, изменив метод кнопки на что-то вроде ниже.Я редактирую вопрос, потому что не могу написать ответ в комментариях:

private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {                                         

    try{ 
        numClick+=100;
        DefaultTableModel model = (DefaultTableModel)jTable1.getModel();
        model.setRowCount(0);
        how.res = how.stat.executeQuery("select * from students limit "+numClick+" , 100");

            while(how.res.next())
            {
            String id = how.res.getString(1);
            String name = how.res.getString(2);
            String contact = how.res.getString(3);

            Object[] content = {id,name,contact};
            model.addRow(content);
            }
        }catch (SQLException e){
        e.printStackTrace();
    }  
}

Ответы [ 2 ]

1 голос
/ 20 апреля 2019

Подсказка: не глотайте исключения и не сталкивайтесь с какими-либо конкретными типами исключений как Exception. В вашем случае вы должны отлавливать их как SQLException и, по крайней мере, печатать их трассировку стека.

Поскольку ваша первая страница - запрос "select * from students order by name ASC limit 100" следующая страница - следующий запрос должен выглядеть примерно так: "select * from students order by name ASC limit "+numClick+" , 100" с numClick, увеличенным на 100 на каждой странице. Конечно, переменная numClick должна обрабатываться PreparedStatement. Прочитайте здесь , как использовать подготовленные заявления .

Чтобы понять LIMIT, взгляните на этот ответ на вопрос в дополнение.

Другой способ, которым вы могли бы дать шанс, если ваши данные немного малы, - это загрузить все в память (структуру данных), а затем заполнить данные оттуда.

Когда вы изменяете страницу, вам придется получать текущие данные из таблицы. Простой вопрос поможет вам в этом вопросе.

0 голосов
/ 20 апреля 2019

Вы можете использовать LIMIT 0, 100

SELECT * FROM students ORDER by name ASC LIMIT 0, 100    // Returns 1   -> 100
SELECT * FROM students ORDER by name ASC LIMIT 100, 101  // Returns 101 -> 201
SELECT * FROM students ORDER by name ASC LIMIT 200, 101  // Returns 201 -> 301
...