0

テキスト ファイルから多くの行を読み取る必要がある Java コードがあり、読み取った行でレコードを更新する必要があります。たとえば、テキスト ファイルには aaa、bbb、ccc、.. など (コンマは改行を意味します) が含まれているため、record1 の col4 を値 aaa で更新し、record2 を値 bbb で更新したいと考えています。

すべてのレコードを自動的に更新する更新ステートメントを作成するにはどうすればよいですか??

これは私のJavaコードです:

counter=0;
        while((fileLine=in.readLine())!=null) 
        { 
            System.out.println("Line read is: "+fileLine);

                //execute db insertion
                try {
                    //insert in the database
                    String Query= "update db.table set col4=?";    //database
                    preparedStmt3 = DBConnection.con.prepareStatement(Query); 
                    preparedStmt3.setString (1, fileLine);
                    preparedStmt3.executeUpdate();
                    System.out.println("Complete update statement for row: "+counter);
                    counter++;
                } catch (Exception e) {
                    System.out.println("DB_Error:_"+ e.toString());
                }

        } //end while loop 
4

2 に答える 2

3

注:前述Andreasのとおり、Frank更新ステートメントは少し正しくないようです。update ステートメントからwhere句が欠落しているようです。これは、PreparedStatement に 1 つのパラメーターのみを設定しようとしているためです。理想的には、更新ステートメントは次のようになります。

UPDATE table_name
SET column1=?, column2=?,...
WHERE some_column=?

つまり、更新が必要なレコードを識別するために、 where句に少なくとも 1 つ以上の列が必要です。WHERE 句を省略した場合、すべてのレコードが更新されます (これは、やりたくないことかもしれません) 。

また、膨大なデータセットのパフォーマンス向上として、一括更新を検討してください。したがって、次のようにします。

  • バッチ サイズを作成します。
  • ファイルから読み取った行ごとに、バッチに追加します。これは、 PreparedStatementのaddBatch()メソッドを呼び出すことで実行できます。
  • バッチ サイズに達したら、executeBatch()を呼び出してバッチを実行します。次に、バッチをクリアし ( clearBatch() )、ファイルからすべての行の読み取りが完了するまでプロセスを続行します。

このようなもの:

PreparedStatement preparedStmt3 = null;
try{
    counter=0;
    int batchCutoff = 1000, currentBatchSize = 0;

    Query= "update db.table set col4=?";    //database
    preparedStmt3 = DBConnection.con.prepareStatement(Query); 

    while((fileLine=in.readLine())!=null) 
    { 
        System.out.println("Line read is: "+fileLine);
        //execute db insertion
        try {
            //insert in the database
            preparedStmt3.setString (1, fileLine);
            preparedStmt3.addBatch();
            preparedStmt3.clearParameters();
            currentBatchSize++;

            if(currentBatchSize >= batchCutoff){
                preparedStmt3.executeBatch();
                preparedStmt3.clearBatch();
                System.out.println("Complete update statement for: "+currentBatchSize+" row(s)");
                currentBatchSize = 0;
            }
            counter++;
        } catch (Exception e) {
            System.out.println("DB_Error:_"+ e.toString());
        }
    } //end while loop 
    //In case the cut-off has not been reached and some statements in the batch are remaining
    try{
        preparedStmt3.executeBatch();
        preparedStmt3.clearBatch();
    }catch (Exception e) {
            System.out.println("DB_Error:_"+ e.toString());
    }finally{
        System.out.println("Total of: "+counter+" row(s) updated");
    }
}finally{
    if(preparedStmt3 != null){
        try{
            preparedStmt3.close();
        }catch(Exception exe){
        }
    }
}
于 2012-09-23T20:13:18.543 に答える
0

カウンターを使用しているため、where句で使用できます

----->>counter=1;
    while((fileLine=in.readLine())!=null) 
    { 
        System.out.println("Line read is: "+fileLine);

            //execute db insertion
            try {
                //insert in the database
                String Query= "update db.table set col4=? where id=?";    //database
                preparedStmt3 = DBConnection.con.prepareStatement(Query); 
                preparedStmt3.setString (1, fileLine);
       ---->>   preparedStmt3.setInt(2,counter);
                preparedStmt3.executeUpdate();
                System.out.println("Complete update statement for row: "+counter);
                counter++;
            } catch (Exception e) {
                System.out.println("DB_Error:_"+ e.toString());
            }

    } //end while loop 

変更した場所に矢印を挿入しました

于 2012-10-16T08:08:50.543 に答える