Java SwingでJTableにSQLiteデータを表示!ResultSetをTableModelに変換する方法

2024-07-27

Java SwingでSQLiteのResultSetをJTableに読み込む方法

Java SwingでSQLiteデータベースから取得したResultSetをJTableに読み込む方法は、主に以下の3つのステップで構成されます。

  1. データベース接続とデータ取得:
  2. TableModelの作成:
  3. JTableへのデータ設定:

詳細

データベース接続とデータ取得

import java.sql.*;

public class ResultSetToTableDemo {

    public static void main(String[] args) {
        // データベース接続
        Connection conn = null;
        try {
            conn = DriverManager.getConnection("jdbc:sqlite:test.db");
        } catch (SQLException e) {
            e.printStackTrace();
            return;
        }

        // SQLクエリ実行
        String sql = "SELECT * FROM customers";
        Statement stmt = null;
        ResultSet rs = null;
        try {
            stmt = conn.createStatement();
            rs = stmt.executeQuery(sql);
        } catch (SQLException e) {
            e.printStackTrace();
        }

        // データ取得処理
        if (rs != null) {
            // TableModelの作成
            TableModel tableModel = createTableModel(rs);

            // JTableへのデータ設定
            JTable table = new JTable(tableModel);
            JScrollPane scrollPane = new JScrollPane(table);

            // フレームの作成と表示
            JFrame frame = new JFrame("ResultSet to JTable");
            frame.getContentPane().add(scrollPane);
            frame.pack();
            frame.setVisible(true);
        }

        // リソースのクローズ
        try {
            if (rs != null) rs.close();
            if (stmt != null) stmt.close();
            if (conn != null) conn.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    private static TableModel createTableModel(ResultSet rs) throws SQLException {
        // 列名を取得
        int columnCount = rs.getMetaData().getColumnCount();
        String[] columnNames = new String[columnCount];
        for (int i = 1; i <= columnCount; i++) {
            columnNames[i - 1] = rs.getMetaData().getColumnName(i);
        }

        // 行数とデータを取得
        int rowCount = 0;
        while (rs.next()) {
            rowCount++;
        }
        rs.beforeFirst();

        Object[][] data = new Object[rowCount][columnCount];
        for (int row = 0; row < rowCount; row++) {
            for (int col = 0; col < columnCount; col++) {
                data[row][col] = rs.getObject(col + 1);
            }
            rs.next();
        }

        // TableModelの作成
        return new DefaultTableModel(data, columnNames);
    }
}

TableModelの作成

上記コードの createTableModel メソッドでは、ResultSetのデータ構造に基づいてTableModelを作成します。

  • 列名: ResultSetのメタデータから列名を取得します。
  • 行数とデータ: ResultSetをループして行数とデータを取得し、2次元配列に格納します。
  • TableModel: DefaultTableModel クラスを使用して、列名とデータからTableModelを作成します。

JTableへのデータ設定

TableModelを作成したら、JTable コンストラクタを使用してJTableに設定します。

  • 上記コードはあくまでも基本的な例です。実際のアプリケーションでは、エラー処理やデータ変換などの処理を追加する必要があります。
  • より効率的にデータを読み込む場合は、LazyTableModel などのライブラリを使用するのも有効です。



import java.sql.*;
import javax.swing.*;

public class ResultSetToTableDemo {

    public static void main(String[] args) {
        // データベース接続
        Connection conn = null;
        try {
            conn = DriverManager.getConnection("jdbc:sqlite:test.db");
        } catch (SQLException e) {
            e.printStackTrace();
            return;
        }

        // SQLクエリ実行
        String sql = "SELECT * FROM customers";
        Statement stmt = null;
        ResultSet rs = null;
        try {
            stmt = conn.createStatement();
            rs = stmt.executeQuery(sql);
        } catch (SQLException e) {
            e.printStackTrace();
        }

        // データ取得処理
        if (rs != null) {
            try {
                // TableModelの作成
                TableModel tableModel = createTableModel(rs);

                // JTableへのデータ設定
                JTable table = new JTable(tableModel);
                JScrollPane scrollPane = new JScrollPane(table);

                // フレームの作成と表示
                JFrame frame = new JFrame("ResultSet to JTable");
                frame.getContentPane().add(scrollPane);
                frame.pack();
                frame.setVisible(true);
            } finally {
                // リソースのクローズ
                try {
                    if (rs != null) rs.close();
                    if (stmt != null) stmt.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }

        // 接続のクローズ
        try {
            if (conn != null) conn.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    private static TableModel createTableModel(ResultSet rs) throws SQLException {
        // 列名を取得
        int columnCount = rs.getMetaData().getColumnCount();
        String[] columnNames = new String[columnCount];
        for (int i = 1; i <= columnCount; i++) {
            columnNames[i - 1] = rs.getMetaData().getColumnName(i);
        }

        // 行数とデータを取得
        int rowCount = 0;
        while (rs.next()) {
            rowCount++;
        }
        rs.beforeFirst();

        Object[][] data = new Object[rowCount][columnCount];
        for (int row = 0; row < rowCount; row++) {
            for (int col = 0; col < columnCount; col++) {
                data[row][col] = rs.getObject(col + 1);
            }
            rs.next();
        }

        // TableModelの作成
        return new DefaultTableModel(data, columnNames);
    }
}

このコードの説明

  • データベース接続:
    • DriverManager.getConnection() メソッドを使用して、SQLiteデータベースに接続します。
    • データベースファイル名は test.db と仮定しています。
  • SQLクエリ実行:
  • データ取得処理:
    • ResultSet オブジェクトから列名と行データを取得し、2次元配列に格納します。
    • TableModel オブジェクトを作成し、JTableに設定します。
  • JTableの作成と表示:
    • JTable コンストラクタを使用して、TableModelからJTableを作成します。
    • JScrollPane コンポーネントを使用して、JTableをスクロールできるようにします。
    • JFrame コンポーネントを使用して、JTableを含むフレームを作成し、表示します。
  • リソースのクローズ:

実行方法

  1. このコードを ResultSetToTableDemo.java という名前のファイルに保存します。
  2. SQLiteデータベースファイル test.db を作成し、customers テーブルを作成します。
    • customers テーブルには、少なくとも idnameemail の3つの列が必要です。
  3. 以下のコマンドを使用して、コードをコンパイルします。
javac ResultSetToTableDemo.java
java ResultSetToTableDemo

注意事項

  • このコードはあくまでもサンプルであり、実際のアプリケーションでは必要に応じて修正する必要があります



Apache DbUtils ライブラリを使用すると、ResultSetからTableModelを簡単に作成することができます。

import org.apache.commons.dbutils.DbUtils;
import org.apache.commons.dbutils.ResultSetHandler;
import org.apache.commons.dbutils.RowProcessor;

import java.sql.*;
import javax.swing.*;

public class ResultSetToTableDemoWithDbUtils {

    public static void main(String[] args) {
        // データベース接続
        Connection conn = null;
        try {
            conn = DriverManager.getConnection("jdbc:sqlite:test.db");
        } catch (SQLException e) {
            e.printStackTrace();
            return;
        }

        // SQLクエリ実行
        String sql = "SELECT * FROM customers";
        Statement stmt = null;
        ResultSet rs = null;
        try {
            stmt = conn.createStatement();
            rs = stmt.executeQuery(sql);
        } catch (SQLException e) {
            e.printStackTrace();
        }

        // データ取得処理
        if (rs != null) {
            try {
                // TableModelの作成
                TableModel tableModel = DbUtils.populateTableModel(rs, new BeanHandler<>(Customer.class));

                // JTableへのデータ設定
                JTable table = new JTable(tableModel);
                JScrollPane scrollPane = new JScrollPane(table);

                // フレームの作成と表示
                JFrame frame = new JFrame("ResultSet to JTable");
                frame.getContentPane().add(scrollPane);
                frame.pack();
                frame.setVisible(true);
            } finally {
                // リソースのクローズ
                try {
                    if (rs != null) rs.close();
                    if (stmt != null) stmt.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }

        // 接続のクローズ
        try {
            if (conn != null) conn.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    private static class Customer {
        private int id;
        private String name;
        private String email;

        // ゲッターとセッター
        // ...
    }
}

Java 8 Stream API の使用

Java 8以降では、Stream APIを使用してResultSetからTableModelを簡単に作成することができます。

import java.sql.*;
import javax.swing.*;
import java.util.stream.Collectors;

public class ResultSetToTableDemoWithStreamAPI {

    public static void main(String[] args) {
        // データベース接続
        Connection conn = null;
        try {
            conn = DriverManager.getConnection("jdbc:sqlite:test.db");
        } catch (SQLException e) {
            e.printStackTrace();
            return;
        }

        // SQLクエリ実行
        String sql = "SELECT * FROM customers";
        Statement stmt = null;
        ResultSet rs = null;
        try {
            stmt = conn.createStatement();
            rs = stmt.executeQuery(sql);
        } catch (SQLException e) {
            e.printStackTrace();
        }

        // データ取得処理
        if (rs != null) {
            try {
                // TableModelの作成
                TableModel tableModel = new DefaultTableModel(
                        rs.getMetaData().getColumnNames(),
                        0,
                        rs.stream()
                                .map(row -> rowToRowData(row))
                                .collect(Collectors.toList())
                                .toArray(new Object[0][0])
                );

                // JTableへのデータ設定
                JTable table = new JTable(tableModel);
                JScrollPane scrollPane = new JScrollPane(table);

                // フレームの作成と表示
                JFrame frame = new JFrame("ResultSet to JTable");
                frame.getContentPane().add(scrollPane);
                frame.pack();
                frame.setVisible(true);
            } finally {
                // リソースのクローズ
                try {
                    if (rs != null) rs.close();
                    if (stmt != null) stmt.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }

        // 接続のクローズ
        try {
            if (conn != null) conn.close();
        } catch (SQLException e) {
            e.printStackTrace();

java swing sqlite



JavaとSQLiteを使ってToDoリストアプリを作成しよう

Javaは、世界中で愛される汎用プログラミング言語です。豊富なライブラリと高い汎用性で、Webアプリケーション、デスクトップアプリ、モバイルアプリなど、あらゆる開発に活躍します。SQLiteは、軽量で高速なオープンソースのデータベースエンジンです。ファイルベースで動作するため、サーバーのインストールや設定が不要で、手軽にデータベースを扱うことができます。...


意外と知らないSQLiteの制限:データ量・アクセス数・複雑なクエリへの対応策

スケーラビリティ とは、システムが負荷増加に対応できる能力を指します。SQLite のスケーラビリティには、いくつかの制限があります。データ量の制限SQLite は、单个ファイルにデータベースを保存する設計になっています。そのため、データ量が大きくなると、ファイルサイズも大きくなり、パフォーマンスが低下します。一般的な目安としては、1つのデータベースファイルは 1GB 以下に抑えることが推奨されています。...


VistaDB の使用方法:サンプルコード、Visual Studio データツール、Entity Framework、LINQ

軽量で高速VistaDB は非常に軽量なデータベースエンジンであり、フットプリントが小さいため、メモリとディスク容量の少ないデバイスに最適です。また、非常に高速なパフォーマンスを提供し、多くの場合、他のデータベースよりも高速にクエリを実行できます。...


WPF アプリケーションにおけるデータベース機能:SQLite、SQL CE、その他の選択肢

SQLite は軽量でオープンソースのデータベースエンジンです。ファイルベースのデータベースなので、サーバーのインストールや設定が不要で、手軽に利用できます。また、C# などの . NET Framework 言語から簡単にアクセスできるため、WPF アプリケーションとの相性も抜群です。...


C++プログラムにデータをSQLiteデータベースとして埋め込む

リソースファイルとしてデータを埋め込む方法は、プログラムの実行ファイルにデータを直接埋め込む方法です。メリット:実行ファイルが単一ファイルになるため、配布が容易データの暗号化など、セキュリティ対策が容易実行ファイルのサイズが大きくなるデータの更新が難しい...



SQL SQL SQL SQL Amazon で見る



.NET Framework と SQLite を使用して XSD データセットに基づいて SQLite データベースを作成する方法

このチュートリアルを完了するには、次のものが必要です。Visual Studio 2019 以降.NET Framework 4.7 以降SQLite ADO. NET プロバイダVisual Studio で新しい C# コンソール アプリケーション プロジェクトを作成します。


ActionScript 3 で SQLite データベースを操作する際のベストプラクティス

ActionScript 3 の開発環境Apache Flex SDKプロジェクトの作成プロジェクトの作成SQLite ライブラリの追加 ダウンロードした SQLite ライブラリをプロジェクトに追加します。SQLite ライブラリの追加ダウンロードした SQLite ライブラリをプロジェクトに追加します。


SQLite3 から MySQL への簡単な移行方法

SQLite3: 小型で軽量なデータベース。単一ファイルとして存在し、アプリケーションに組み込むことができます。MySQL: 汎用的なリレーショナルデータベース管理システム(RDBMS)。大規模なアプリケーションやWebサイトで使用されます。


初心者でも安心!C#でSQLiteデータベースを操作するチュートリアル

ADO. NETは、.NET Frameworkに含まれるデータアクセス技術です。SQLite用のADO. NETプロバイダであるSystem. Data. SQLiteを使用することで、C#からSQLiteデータベースに接続してクエリを実行することができます。


JavaとSQLiteを使ってToDoリストアプリを作成しよう

Javaは、世界中で愛される汎用プログラミング言語です。豊富なライブラリと高い汎用性で、Webアプリケーション、デスクトップアプリ、モバイルアプリなど、あらゆる開発に活躍します。SQLiteは、軽量で高速なオープンソースのデータベースエンジンです。ファイルベースで動作するため、サーバーのインストールや設定が不要で、手軽にデータベースを扱うことができます。