Java SwingでJTableにSQLiteデータを表示!ResultSetをTableModelに変換する方法
Java SwingでSQLiteのResultSetをJTableに読み込む方法
Java SwingでSQLiteデータベースから取得したResultSetをJTableに読み込む方法は、主に以下の3つのステップで構成されます。
- データベース接続とデータ取得:
- TableModelの作成:
- 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を含むフレームを作成し、表示します。
- リソースのクローズ:
実行方法
- このコードを
ResultSetToTableDemo.java
という名前のファイルに保存します。 - SQLiteデータベースファイル
test.db
を作成し、customers
テーブルを作成します。customers
テーブルには、少なくともid
、name
、email
の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