Java JTable显示数据库记录

时间:2012-09-04 05:57:18

标签: java database swing jtable resultset

我在获取数据库记录时遇到问题,在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 个答案:

答案 0 :(得分: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查询更改为不使用'*'并仅列出字段,那也会很棒。

答案 1 :(得分:2)

当我开始回答我之前的答案时。

您可能事先不知道有多少行来自数据库。你可以使用一些技巧,但它们只是最好的猜测(请注意,自从我使用JDBC以来已经有一段时间了。)

如果不知道前面的行数,则需要一些动态数组。有趣的是,Java提供了一个。它被称为ArrayList。这允许您在不知道实际需要多少元素的情况下向其中添加元素。

其次,我将行结果存储在最能代表该对象的Object中,这将大大降低数据结构的复杂性并使其更容易采用代码更改,导致列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,但从长远来看它对你来说会更有用

答案 2 :(得分:1)

确保使用适当的行数和列数初始化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<Model>,其中Model遵循MVC架构。

答案 3 :(得分:1)

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

看到这个很好的例子:

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