【问题标题】:Java JTable Displaying database recordsJava JTable 显示数据库记录
【发布时间】:2012-08-28 18:18:48
【问题描述】:

我在获取数据库记录时遇到问题,让数据库记录显示在 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[][] 数组?

【问题讨论】:

  • 你没问过这个问题吗?? stackoverflow.com/questions/12242333/…
  • 是的,但它只显示在控制台上我如何在 JTable 中显示它我调用了变量数据但没有显示,只有列标题。你能帮我解决这个问题吗?
  • 上一题的概念完全一样。它生成一个 Object[][] 数组,然后可以直接将其馈送到表模型。

标签: java database swing jtable resultset


【解决方案1】:

你应该使用 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 查询更改为不使用“*”并仅列出字段,那也很棒。

【讨论】:

  • 你的两个人的回答都很好,它有效!现在它显示在我的 JTable 谢谢.. 在 sql 语句中使用 * 有什么缺点?抱歉,我是 Java 新手。
  • 1.列的顺序。您目前假设订单是已知的,您不应该这样做。在更坏的情况下,您应该使用列名从结果集中检索值。 2. 您可能需要从数据库中提取更多的数据库。如果表有 100 列怎么办,你会在检索上浪费时间(在数据库上处理)和带宽
  • 谢谢你的权利,它会降低我系统的性能。
【解决方案2】:

确保使用适当的行数和列数初始化 data 的大小。 要获取行数,您可以按照程序集here。而要获得列数,答案在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[][],而是使用List&lt;Model&gt;,其中Model遵循MVC架构。

【讨论】:

  • 在不知道数据库和驱动程序是否支持双向游标的情况下建议使用 ResultSet.last 时我会保持警惕 - 但这并不意味着我不喜欢这个建议 ;)跨度>
【解决方案3】:

正如我在之前的回答中所说的那样。

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

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,但从长远来看,它对您更有用

【讨论】:

  • ArrayList 中的 50 是为什么要显示的结果总数?
  • 来自JavaDocsEach ArrayList instance has a capacity. The capacity is the size of the array used to store the elements in the list. It is always at least as large as the list size. As elements are added to an ArrayList, its capacity grows automatically. The details of the growth policy are not specified beyond the fact that adding an element has constant amortized time cost.
  • 简单地回答你的问题,“50”是一个种子,一个猜测。随着时间的推移添加新元素时,它可以使数组列表更快。 ArrayList 是动态的,这意味着它没有固定的容量,它会随着您向其中添加更多元素而增长,这意味着您不需要预先知道需要多少元素
【解决方案4】:

使用java.util.collection 中的Vectors 将解决您的问题.....

看看这个很好的例子:

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

【讨论】:

猜你喜欢
  • 2013-01-19
  • 1970-01-01
  • 1970-01-01
  • 2019-06-08
  • 2015-07-20
  • 2014-02-13
  • 1970-01-01
  • 2019-03-16
  • 1970-01-01
相关资源
最近更新 更多