[英]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.