簡體   English   中英

如何在Java中從數據庫檢索多行

[英]How to retrieve multiple row from database in java

我需要在JTable的行中插入不同的結果。 我使用purchaseID(即pID)搜索記錄,它將為該特定purchaseID找到2個結果。 問題是當我將其插入行時,它只是復制了第一個結果。 例如:P0001有2個購買詳細信息,當我將其插入行時,我有2個相同的行。 我有什么辦法可以一一插入嗎?

PS。 我從早上開始一直在編碼,大腦運作不正常。

用戶界面:

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

編輯:將Purchase設置為ArrayList <>以接受列表,我得到此異常。

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.
                }

如果要從查詢返回多個對象,則返回類型應為數組或該類型的集合。

因此,與其定義

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而不是購買List ,然后進行迭代並顯示出來。


現在,關於您的編輯部分。 您做錯了幾件事。

首先,您不必進入購買記錄即可查看有多少記錄。 如果沒有,列表將為空。 如果為1,則大小為1,如果為2,則大小為2。

其次,您實際上不需要知道有多少個元素,因為您可以在簡單的for循環中使用列表的迭代器遍歷列表:

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

實際上,您不必使用get 您在變量purchase擁有當前的個人購買(請注意,我已將原始變量的名稱更改為顯示列表而不是購買的名稱),您可以直接使用它。

另請注意,您無需檢查null。 按照我編寫它的方式,DA方法始終返回對列表的引用,即使它是一個空列表也是如此。 並且循環總是向列表中添加實際的new Purchase(…) ,因此列表中的項目也永遠不會為null。

但是,有一件事:從錯誤的外觀來看,當詳細信息ID表示應該有兩行時,似乎只有一行。 直接使用數據庫檢查查詢,以確保實際上有兩條記錄。


如果要在未找到任何內容的情況下顯示錯誤,則應使用if語句檢查列表是否為空。 這意味着根本沒有記錄返回。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM