如何在java中从数据库中检索多行

时间:2014-11-09 20:05:32

标签: java database netbeans jtable

我需要在JTable的行中插入不同的结果。我使用buyID作为pID搜索我的记录,它将找到该特定purchaseID的2个结果。问题是当我将其插入行时,它只是复制第一个的结果。 EG:P0001有2个购买细节,当我将其插入行时,我有2个相同的行。我有什么方法可以逐个插入行吗?

PS。我从早上开始编码,大脑功能不佳。

UI:

else if(e.getSource() == jbtRetrieve)
            {
                String pID = jTF3.getText();

            Purchase purchase = purcControl.selectRecord(pID);
            if (purchase != null) { 
                String pdCountStr = purchase.getPurchaseDetailsID();
                String pdCountStr2 = pdCountStr.substring(2,5);
                int pdCount = Integer.parseInt(pdCountStr2);
                for(int g = 0; g<pdCount;g++){      //g =1


                tableModel.addRow(new Object[]{ purchase.getPurchaseDetailsID(),purchase.getStockID(),purchase.getPrice(),purchase.getQuantity()});

            }}

DA:

  public Purchase getRecord(String pID){
    String queryStr = "SELECT PD.PURCHASEDETAILID,PD.PURCHASEID,PD.STOCKID,PD.ORDERQTY,S.STOCKPRICE FROM "+tableName+" PD, STOCKS S WHERE PD.STOCKID = S.STOCKID AND PurchaseID = ?";
    Purchase purchase = null;

    System.out.println("asd");
    try{
        stmt = conn.prepareStatement(queryStr);
        stmt.setString(1,pID);
        ResultSet rs = stmt.executeQuery();

     if(rs.next()){
        purchase = new Purchase(pID, rs.getString("purchaseID"),rs.getString("stockID"),rs.getDouble("stockprice"),rs.getInt("orderqty"));
         }
     }
       catch (SQLException ex){
        JOptionPane.showMessageDialog(null,ex.getMessage(),"ERROR",JOptionPane.ERROR_MESSAGE);
    }
    return purchase;
}

域:

public Purchase(String purchaseDetailsID,String purchaseID,String stockID,double price,int quantity)
{
    this.purchaseDetailsID = purchaseDetailsID;
    this.purchaseID = purchaseID;
    this.stockID = stockID;
    this.price = price;
    this.quantity = quantity;

}

public void setPurchaseID(String u){
    this.purchaseID = u;
} 
public String getPurchaseID(){
    return purchaseID;
}
public String getPurchaseDetailsID(){

    return purchaseDetailsID ;

}
public double getPrice(){
    return price;
}
public String getStockID(){
    return stockID;
}
public int getQuantity(){
    return quantity;
}
public void setPurchaseDetailsID(String r){
    this.purchaseDetailsID = r ;
}
public void setPrice(double p){
    this.price = p;
}
public void setStockID(String s){
    this.stockID = s;
}
public void setQuantity(int q){
    this.quantity = q;
}

控制:

public Purchase selectRecord(String pID){

    return purcDA.getRecord(pID);
}

编辑:将购买设置为ArrayList&lt;&gt;接受列表,我得到这个例外。

Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Index: 1, Size: 1
at java.util.ArrayList.rangeCheck(ArrayList.java:635)   at java.util.ArrayList.rangeCheck(ArrayList.java:635)
at java.util.ArrayList.get(ArrayList.java:411)
at ui.MainPurchasingFrame$ListenerClass.actionPerformed(MainPurchasingFrame.java:183)

代码:

ArrayList<Purchase> purchase = purcControl.selectRecord(pID);
   if (purchase != null) { 
                String pdCountStr = purchase.get(0).getPurchaseDetailsID();
                String pdCountStr2 = pdCountStr.substring(2,5);
                int pdCount = Integer.parseInt(pdCountStr2);
                System.out.print(pdCount);
                for(int g = 0; g<pdCount;g++){
                tableModel.addRow(new Object[]{ purchase.get(g).getPurchaseDetailsID(),purchase.get(g).getStockID(),purchase.get(g).getPrice(),purchase.get(g).getQuantity()}); //This is where the exception occurs.
                }

1 个答案:

答案 0 :(得分:2)

如果要从查询中返回多个对象,则返回类型应为数组或该类型的集合。

所以不要定义

public Purchase getRecord(String pID){…}

您应该将DA方法定义为:

public List<Purchase> getRecords(String pID) {…}

在方法内部,定义一个列表对象,例如:

List<Purchase> foundPurchases = new ArrayList<>();

然后在发出查询并获取结果集之后,使用while循环来填充它:

while ( rs.next() ) {
    purchase = new Purchase(pID, rs.getString("purchaseID"),rs.getString("stockID"),rs.getDouble("stockprice"),rs.getInt("orderqty"));

    foundPurchases.add( purchase );
}

然后,在完成并关闭语句后,您应该返回foundPurchases:

return foundPurchases;

当然,调用代码应该会收到List次购买而不是购买,然后迭代并显示它。


现在关于你编辑的部分。你正在做不正确的事情。

首先,您不必进入购买记录以查看有多少记录。如果没有,则列表将为空。如果有1,它的大小将是1,如果有2,它的大小将是2。

其次,你实际上不需要知道有多少元素,因为你可以在一个简单的for循环中使用它的迭代器来遍历一个列表:

ArrayList<Purchase> purchaseList = purcControl.selectRecord(pID); 
for ( Purchase purchase : purchaseList ) {
    …
}

您实际上不必使用get。您在变量purchase中有当前的个人购买(请注意,我将原始变量的名称更改为显示列表而非购买的内容),您可以直接使用它。

另请注意,您无需检查空值。我编写它的方式,DA方法总是返回对List的引用,即使它是一个空列表。并且循环总是向列表添加实际new Purchase(…),因此列表的项也永远不会为空。

但有一件事:从错误看起来的方式来看,当细节ID表示应该有两行时,似乎只有一行。直接用数据库检查您的查询,以确保实际上有两个记录。


如果要在未找到任何内容时显示错误,则应使用if语句检查列表是否为空。这意味着根本没有返回任何记录。

if ( purchasedList.isEmpty() ) {
    // Display error dialog
} else {
    // Do the for loop to fill the rows
}