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