2016-08-10 48 views
2

SQLデータベースからデータを読み込むためのクラスを作成します。このクラスでは、一度に1つのデータベーステーブルを1行ずつ読み取ることができるメソッドが必要です。データはJavaオブジェクトに渡され、ユーザーはそれを使って何かを行うことができます。その後、ユーザーは次の行を読むことができます。Java SQLデータベーステーブルを一度に1行ずつ読み込みます

私のコードは:

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

} 

私は、ユーザーが一度にデータ1を取得するために次の操作を行うことができます想定しています

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 

私は考えることができる唯一の方法は、ResultSetのローカル変数を保持していますそれが終わるまでrs.next()を使います。しかし、それが良い方法であるかどうかはわかりません。 ResultSetを使用せずに私がしたいことをするための良い方法はありますか?私は一度にテーブル1からデータを読み込みたいだけです。ありがとう。

+1

limit句を使用できます。たとえば、mysql LIMITのhttp://dev.mysql.com/doc/refman/5.7/en/select.htmlでは、現在の行とオフセットをトラッキングするためにパラメータを渡す必要があります。この場合は1です。結果セットは1つに制限されます。あなたのオプションがあなたが使用しているDBのために何であるか分かりません。 – jasonlam604

+0

@ jasonlam604ありがとうございます。しかし、私は顧客のために複数のリレーショナルデータベースをサポートする必要があるので、それはうまくありません。それはオフセットを取って追跡のために使用するため、やりやすいようです。私がサポートしなければならないデータベースは、SQLServer、MySQL、Oracle、PostgreSQLなど数多くあります。 –

+0

どのデータベースですか?残念ながら、すべてに適用できる共通のSQL文はありません。各dbの個々の句を見つけ、コードを使用して適切なものを動的に適用する必要があります。 Oracleを使用したもう1つの例は、http://stackoverflow.com/questions/470542/how-do-i-limit-the-number-ofrows-returned-by-an-oracle-query-after-ordering – jasonlam604

答えて

0

getData()メソッドが呼び出されるたびにresultSetオブジェクトをクラスに保持し、resultSet.next()を呼び出してこのテーブルの別の行を取得します。 しかし、これは良い考えではありません。データベース接続が解放されず、データベース接続がシステム全体のまれなソースとなるためです。さらに、データベースの分離により、他のスレッドによる更新を読み取ることができなくなります。

+0

それは私が考えていたものです。 DataSourceを使用して接続を取得しています。 close()は実際に接続を閉じるわけではありませんが、プールに戻します。したがって、ローカル変数を保持することがこの場合の唯一の方法であれば、それ以降解放する接続についてあまり心配しないでください。 –

+1

接続が返ってこない場合、他のスレッドは決して接続を使用することはできません。 –

+0

私は私の答えとしてこれを受け入れています。私のチームの高齢者は、これは素晴らしい解決策だと言います。私が構築しているアプリケーションでは、データベースからデータを読み続ける作業者を作成します。したがって、ジョブが完了するまで、接続を開いたままにして、結果セットオブジェクトを生かしておくことは問題ありません。どうも –

関連する問題