0

我在获取数据库记录时遇到问题,在 JTable 中显示数据库记录的最佳方法是什么,所以现在我使用结果集来获取记录并将其存储在 Object[][] 数组中,我想要这个变量让说 Object[][] data 它的值要显示在 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

你应该使用 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 回答
2

正如我在之前的回答中开始的那样。

您可能不会提前知道有多少行来自数据库。您可以使用一些技术,但它们充其量只是猜测(请注意,我已经有一段时间没有使用 JDBC)了。

在不预先知道行数的情况下,您需要某种动态数组。有趣的是,Java 提供了一个。它被称为ArrayList。这使您可以在不知道实际需要多少元素的情况下向其中添加元素。

其次,我会将你的行结果存储在一个最能代表该对象的对象中,这将大大降低数据结构的复杂性,并使代码更容易采用更改,因为 x 列将是你的值多长时间再期待……

就像是

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 回答
1

确保data使用适当的行数和列数初始化大小。要获取行数,您可以按照此处设置的程序进行操作。要获得列数,可以在JavaDocs上找到答案。

通过这种方式,您可以删除上面的循环之一。只留下你

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[][],而是使用遵循 MVC 架构的List<Model>其中。Model

于 2012-09-04T06:10:50.600 回答
1

使用Vectorsfromjava.util.collection将解决您的问题.....

看到这个很好的例子:

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

于 2012-09-04T06:18:22.177 回答