0

データベース レコードの取得に問題があります。データベース レコードを JTable に表示する最善の方法は何でしょうか。そのため、現在、結果セットを使用してレコードを取得し、それを Object[][] 配列に格納しました。この変数を使用して、 Object[][] データの値を JTable に表示するとしますが、これが正しいかどうかはわかりません。また、データベース内のレコードに応じて Object[][] データ サイズを初期化するにはどうすればよいですか。ありがとう

ここに私のコードがあります:

ResultSet rs = null;
Statement sql = null;
Object[][] data = new Object[100][100];

        String query = "SELECT * FROM INVENTORY";
        sql = con.createStatement();
        sql.executeQuery(query);
        rs = sql.getResultSet();

        while(rs.next()){
            for(int i = 0; i < data.length; i++){
                for(int j = 0; j < data[i].length; j++){
                    int valId = rs.getInt(1);
                    String valName = rs.getString(2);
                    String valCat = rs.getString(3);
                    String valDesc = rs.getString(4);
                    double  valPrice = rs.getDouble(5);
                    int valstock = rs.getInt(6);
                    int valSupply = rs.getInt(7);

                    System.out.println(valId);
                    System.out.println(valName);
                    System.out.println(valCat);
                    System.out.println(valDesc);
                    System.out.println(valPrice);
                    System.out.println(valstock);
                    System.out.println(valSupply);

ご覧のとおり、レコードをフェッチするために複数の for ループを使用していますが、複数の for ループを使用するのは正しいですか? または簡単な方法はありますか?データベースの合計レコードに応じて Object[][] 配列を初期化するにはどうすればよいですか?

4

4 に答える 4

2

前の回答で始めたように。

データベースから取得される行数は、事前にわからない可能性があります。使用できる手法はいくつかありますが、それらはせいぜい推測にすぎません (注意してください、私が JDBC で遊んでからしばらく経ちました)。

行数を事前に知らなくても、ある種の動的配列が必要です。おもしろいことに、Java はそれを提供します。それはArrayListと呼ばれます。これにより、実際に必要な要素の数を知らなくても要素を追加できます。

次に、行の結果をそのオブジェクトを最もよく表すオブジェクトに保存します。これにより、データ構造の複雑さが大幅に軽減され、コードへの変更の採用が容易になります。期待している...

何かのようなもの

public class Inventory {

    private int id;
    private String name;
    private String catagory;
    private String description;
    private double  price;
    private int stock;
    private int supply;

    public Inventory(int id, String name, String catagory, String description, double price, int stock, int supply) {
        this.id = id;
        this.name = name;
        this.catagory = catagory;
        this.description = description;
        this.price = price;
        this.stock = stock;
        this.supply = supply;
    }

    public void setCatagory(String catagory) {
        this.catagory = catagory;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public void setId(int id) {
        this.id = id;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    public void setStock(int stock) {
        this.stock = stock;
    }

    public void setSupply(int supply) {
        this.supply = supply;
    }

    public String getCatagory() {
        return catagory;
    }

    public String getDescription() {
        return description;
    }

    public int getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public double getPrice() {
        return price;
    }

    public int getStock() {
        return stock;
    }

    public int getSupply() {
        return supply;
    }

}

例えば。

この情報をリストに保存します

List<Inventory> inventoryList = new ArrayList<Inventory>(50); // This is a "seed" value to helps performance
while(rs.next()){
    Inventory inventory = new Inventory(rs.getInt(1),
        rs.getString(2),
        rs.getString(3),
        rs.getString(4),
        rs.getDouble(5),
        rs.getInt(6),
        rs.getInt(7))
    inventoryList.add(inventory);
}

基本的にそこから、単純にリストを使用したくなります。これは、おそらく独自のAbstractTableModelを実装する必要があることを意味しますが、長期的にははるかに便利です。

于 2012-09-04T06:17:30.150 に答える
2

ArrayList を使用する必要があります

まず、データ ホルダーを作成します。

ArrayList<Object[]> data = new ArrayList<Object[]>();

次に、resultSet を行ごとに反復処理し、行を保存するたびに新しい Object[] 配列を作成します。テーブル内のアイテムの数は、行の列の数である必要があります。

while(rs.next()){
    Object[] row = new Object[]{rs.getInt(1), 
                    rs.getString(2), 
                    rs.getString(3), 
                    rs.getString(4),
                    rs.getDouble(5),
                    rs.getInt(6),
                    rs.getInt(7)};
    data.add(row);
}
Object[][] realData = data.toArray(new Object[data.size()][]);

'*' を使用せず、フィールドのみをリストするように SQL クエリを変更することも素晴らしいことです。

于 2012-09-04T06:09:30.313 に答える
1

data適切な行数と列数でサイズを初期化してください。行数を取得するには、ここで設定した手順に従います。列数を取得するには、JavaDocsに答えがあります。

このようにして、上記のループの 1 つを削除します。あなただけを残して

final int columnCount = rs.getMetaData().getColumnCount();
int row = 0;
while(rs.next()) {
   for(int index = 0; index < columnCount; index ++) {
      data[row][index] = rs.getObject(index);
   }
   row ++;
}

Object[][]または、 を使用するList<Model>代わりにModel、 が MVC アーキテクチャに準拠している を使用します。

于 2012-09-04T06:10:50.600 に答える
1

Vectorsfromを使用java.util.collectionすると問題が解決します.....

この素敵な例を見てください:

http://chang.advits.com/populate-data-from-database-into-jtable-in-netbeans

于 2012-09-04T06:18:22.177 に答える