2016-08-10 2 views
2

Ich möchte eine Klasse schreiben, um Daten aus der SQL-Datenbank lesen zu können. In der Klasse sollte eine Methode vorhanden sein, die eine bestimmte Datenbanktabelle Zeile für Zeile lesen kann. Die Daten werden in das Java-Objekt übertragen und der Benutzer kann etwas damit tun. Dann kann der Benutzer die nächste Zeile lesen und so weiter.Java SQL liest die Datenbanktabelle Zeile für Zeile

Meine Codes:

public class DatabaseReader { 

    String table = ""; 

    protected boolean available; 

    public boolean isAvailable() 
    { 
     return available; 
    } 

    public void setTable(String table) 
    { 
     this.table = table; 
    } 

    public String[] getData() 
    { 
     String sql = "SELECT * FROM "+table+";"; 

     Connection con = getConnection(); 
     Statement stmt = con.createStatement(); 
     ResultSet rs = stmt.executeQuery(sql); 

     ResultSetMetaData rm = rs.getMetaData(); 

     int count = rm.getColumnCount(); 

     /** 
     * so I don't know what to do in here 
     * is there a better way to keep track of what rows already been read? 
     */ 
     if (rs.next()) { 
      for (int i = 1; i <= count; i++) { 
       System.out.print(rs.getString(i)+" , "); 
      } 
      System.out.println(); 
      available = true; 
     } else { 
      available = false; 
     } 
    } 

} 

Ich nehme an Benutzer zu einem Zeitpunkt die folgenden zu bekommen Daten man tun kann:

DatabaseReader reader = new DatabaseReader(); 
reader.setTable("Product"); // assume Product table contains ID, name, price, etc. 
while (reader.isAvailable) { 
    String[] data = getData(); 
    Product product = new Product(data); 
    // add to a list of products or they can do something else 
} 
// maybe calculate total price of all products or whatever 

Die einzige Art, wie ich denken kann, ist eine lokale Variable halten für ResultSet und benutze rs.next() bis es fertig ist. Aber ich bin mir nicht sicher, ob das ein guter Weg ist. Gibt es einen besseren Weg, um zu tun, was ich will, ohne ResultSet zu verwenden? Ich möchte nur Daten aus Tabelle eins nach der anderen lesen. Vielen Dank.

+1

Sie können möglicherweise eine Limit-Klausel verwenden. Zum Beispiel müssen Sie in mysql LIMIT http://dev.mysql.com/doc/refman/5.7/en/select.html die Parameter übergeben, um Ihre aktuelle Zeile und den Offset zu verfolgen, was in diesem Fall 1 ist. Das würde Ihre Ergebnismenge auf nur einen beschränken. Nicht sicher, was Ihre Optionen für die DB sind, die Sie verwenden, was ist? – jasonlam604

+0

@ jasonlam604 danke, aber das ist nicht gut, weil ich mehr als eine relationale Datenbank für Kunden unterstützen muss. Das scheint einfach zu sein, weil es einen Offset benötigt und das für das Tracking verwendet. Datenbank, die ich unterstützen muss, sind viele, wie SQLServer, MySQL, Oracle, PostgreSQL und einige andere. –

+0

Welche Datenbank? Ich denke, leider gibt es keine gemeinsame SQL-Anweisung, die auf alle angewendet werden kann. Sie müssen die einzelnen Klauseln für jede Datenbank finden und dann dynamisch den passenden Code anwenden. Ein weiteres Beispiel mit Oracle http://stackoverflow.com/questions/470542/how-do-i-limit-the-number-of-rows-returned-by-an-oracle-query-after-order – jasonlam604

Antwort

0

Sie können das ResultSet-Objekt in Ihrer Klasse halten, und jedesmal, wenn die Methode getData() aufgerufen wird, rufen Sie resultSet.next() auf, um eine weitere Zeile in dieser Tabelle zu erhalten. Dies ist jedoch keine gute Idee., weil die Datenbankverbindung nicht freigegeben wird und die Datenbankverbindung eine seltene Quelle des gesamten Systems ist. Außerdem können Sie aufgrund der Isolation der Datenbank keine Updates von anderen Threads lesen.

+0

Richtig, genau das habe ich mir gedacht. Ich verwende DataSource, um die Verbindung herzustellen. Ich habe gelernt, das Schließen() wird die Verbindung nicht wirklich schließen, aber es wird es in den Pool zurückgeben. Also, wenn das Halten einer lokalen Variable die einzige Möglichkeit für diesen Fall ist, sollte nicht zu viel Sorge über die Freigabe der Verbindung dann sein? –

+1

Wenn Sie die Verbindung nie zurückgeben, hat der andere Thread möglicherweise nie die Möglichkeit, sie zu verwenden. –

+0

Ich akzeptiere dies als meine Antwort, da die Senioren in meinem Team sagen, dass dies eine gute Lösung ist. In der von mir erstellten Anwendung erstellen wir Worker, die weiterhin Daten aus der Datenbank lesen. Es ist also in Ordnung, die Verbindung offen zu halten und das Ergebnis-Set-Objekt am Leben zu erhalten, bis der Job erledigt ist. Danke –

Verwandte Themen