2012-09-04 119 views
0

我在获取数据库记录时遇到问题,获取数据库记录在JTable中显示的最佳方式是什么,所以现在我使用结果集来获取记录并将其存储在Object []中[ ]数组,我想让这个变量让对象[] []数据的值显示在JTable上,我不知道我是否正确地做了这件事。我怎么能初始化我的对象[] []数据大小取决于我的数据库内的记录。感谢Java JTable显示数据库记录

这里是我的代码:

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循环?或者有没有简单的方法,以及如何初始化我的对象[] []数组取决于我的数据库上的总记录?

+1

你有没有问过这个问题? http://stackoverflow.com/questions/12242333/java-jtable-result-from-database – MadProgrammer

+0

是的,但它只显示在控制台上我怎样才能显示它在JTable我称为可变数据,但什么都不显示,但列标题只要。你能帮助我吗? – Zyrax

+0

上一个问题的概念完全相同。它生成一个Object [] []数组,然后可以将其直接输入到表模型中。 – MadProgrammer

回答

2

你应该使用ArrayList

首先创建数据持有者:

ArrayList<Object[]> data = new ArrayList<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查询不使用“*”,只是列表中的字段。

+0

+1建议不要使用“*” – MadProgrammer

+0

男人你的答案都很好,它的工作原理!现在它显示在我的JTable谢谢..在sql语句中使用*的缺点是什么?对不起,我是Java的noob。 – Zyrax

+1

1.列的顺序。您目前假设订单已知,您不应该那样做。在更糟糕的情况下,您应该使用列名从结果集中检索值。 2.你可能需要从数据库中提取更多的数据库。如果表格有100列的话,你会浪费时间(处理数据库)和带宽回复 – MadProgrammer

1

确保您使用适当的行和列计数初始化data的大小。 要获得行数,您可以按照程序集here。为了获得列数,答案见于JavaDocs

用这种方法可以删除上面的一个循环。 离开你只能用,而不是使用Object[][]

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 ++; 
} 

或者,使用List<Model>其中Model遵循MVC架构。

+0

我很担心建议使用ResultSet.last而不知道数据库和驱动程序是否支持双向游标 - 并不意味着我不喜欢这个建议;) – MadProgrammer

+0

@MadProgrammer,我同意。 –

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

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,但它会从长远来看

+0

什么是ArrayList中的50是要显示的结果总数? – Zyrax

+0

从[JavaDocs](http://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html#ArrayList%28int%29)'每个ArrayList实例都有一个容量。容量是用于存储列表中元素的数组大小。它总是至少与列表大小一样大。随着元素被添加到ArrayList,其容量会自动增长。增长政策的细节并未超出添加元素具有不变的摊销时间成本这一事实。 – MadProgrammer

+0

要简单回答您的问题,“50”是种子,是一种猜测。随着时间的推移,添加新元素会使数组列表更快。 'ArrayList'是动态的,这意味着它没有固定的容量,它会随着你添加更多的元素而增长,这意味着你不需要知道你需要的元素数量 – MadProgrammer