0

特殊文字を置き換える必要がある挿入ステートメントである文字列がありますか? リストから特定の要素に。クエリ文字列は

insert into OPRS_VEHICLE(VEHICLE_ID, DEPOT_ID, SERVICE_TYPE_ID, REGISTRATION_KEY,
                          REGISTRATION_NO, IS_ACTIVE,CREATED_BY, CREATED_DATE,
                          MODIFIED_BY, MODIFIED_DATE) values(?,?,?,?,?,?,?,?,?,?)

今、私はそれぞれを交換する必要がありますか?値を含むリストの特定の要素を持つ文字。

私はこれを試しました

int index = query.indexOf("?");
for (int j = 0; j < list.size(); j++) {
     formattedQuery = query.replace(query.substring(index, index+1), 
                                    list.get(j).toString());
}

? を置き換える必要があります。リストの対応する値で。

編集

try{
            conn.setAutoCommit(false);
            if(query != null){  
                ps = conn.prepareStatement(query);
                for (int i = 0; i < myCollection.size(); i++) {
                    List list = (List) myCollection.get(i);
                    int count = 1;
                    for (int j = 0; j < list.size(); j++) {                     
                        if(list.get(j) instanceof Timestamp) {
                            ps.setTimestamp(count,  (Timestamp) list.get(j));       
                        } else if(list.get(j) instanceof java.lang.Character) {
                            ps.setString(count, String.valueOf(list.get(j)));
                        }
                        else {
                            ps.setObject(count, list.get(j));
                        }
                        count++;
                    }
                    try {
                        ps.execute();
                    } catch (Exception e) {


                        }

準備されたステートメントの実行が失敗した場合は、コレクション リスト全体を取得し、一度に 1 つのステートメントを挿入してコミットするメソッドを呼び出す必要があります。これを行う方法 ?(または)配列のサイズを知っているので、配列を半分のサイズに分割してから、そのステートメントを準備して挿入できますか?どちらが安全で良いですか?このようにすることは可能ですか?

前もって感謝します

4

4 に答える 4

5

あなたが持っているクエリ文字列は、実際には、動的な値を持つ SQL ステートメントがJDBCでどのように表現されるかの例です。通常、クエリ文字列内の文字を適切な値に置き換える方法については、PreparedStatementドキュメントの次の例を参照してください。?

PreparedStatement pstmt = con.prepareStatement("UPDATE EMPLOYEES SET SALARY = ? WHERE ID = ?");
pstmt.setBigDecimal(1, 153833.00)
pstmt.setInt(2, 110592)

また、Oracle の JDBC Basics チュートリアルも参照してください

于 2012-10-23T13:03:28.807 に答える
2

この方法では、正しくフォーマットされたクエリを取得することはできません。ベース文字列を置き換えqueryて new に割り当てているためですformattedQuery。これによりformattedQuery、すべての?プレースホルダーが保持されますが、ループの長さの最後のものは保持されます。これはあなたが期待した結果にはなりません。

クエリで値を設定するには、実際にはPreparedStatementを使用する必要があります。
以下の例を参照してください。

PreparedStatement pst = con.prepareStatement( query );
for ( int j = 0; j < list.size(); j++ ) {
    pst.setString( j + 1, list.get( j ).toString() );
}

pst.execute....

更新された投稿に対する回答:

リストから有効なレコードをコミットするために、小さな変更を加えて同じコードを実行できます。
以下のように、コードを部分的に変更し、理解のためにいくつかのコメントを含めました。
それはあなたの問題を解決するはずです:

try {
  conn.setAutoCommit( false );
  if ( query != null ) {  
    ps = conn.prepareStatement( query );
    for ( int i = 0; i < myCollection.size(); i++ ) {
      List list = ( List ) myCollection.get( i );
      int count = 1;
      for ( int j = 0; j < list.size(); j++ ) {  
        if ( list.get( j ) instanceof Timestamp ) {
          ps.setTimestamp( count,  ( Timestamp ) list.get( j ) );       
        } else if( list.get( j ) instanceof java.lang.Character ) {
          ps.setString( count, String.valueOf( list.get( j ) ) );
        } else {
          ps.setObject( count, list.get( j ) );
        }
        count++;
      } // for inner list

      // now a record data is ready
      try {
        ps.execute();

        // no errors? then if you don't want to lose, commit this record.
        // because you are fearing if there would be error in next records to be inserted.
        conn.commit();
      } catch ( Exception specificE ) {
        // handle specific ex here
      } // try, catch

      // clear current record parameters from the prepared statement.
      // this allows to set next record parameters in loop continuation.
      ps.clearParameters();
    } // for outer collection
  } // if query
} catch( Exception e ) {
  // handle general ex here
} finally {
  // close db objects if required
} // try, catch, finally
于 2012-10-23T13:06:31.220 に答える
0

Java Formatterクラスを使用することもできますが、これは通常、?の代わりに値のプレースホルダーとして%を使用します。printf形式の文字列で機能するため。

その後、あなたはすることができます、

Formatter formatter = new Formatter()
formatter.format("INSERT INTO table_name(a_column, another_column) values(%s,%s)", value1, value2);
String formattedString = formatter.toString();

しかし、はい、PreparedStatementを試して使用してください。

また、SpringクラスのSimpleJdbcTemplateには、update(String sql, Object... args)必要な処理を正確に実行するメソッドがあります。

例えば。 jdbc.update(sql, value1, value2)

于 2012-10-23T13:05:46.613 に答える
0

String を使い続けたい場合は、次を試してください。

int index = 0;
String formattedQuery = query;
for (int j = 0; j < list.size(); j++) {
     index = query.indexOf("?",index);
     formattedQuery = formattedQuery.replaceFirst("\\?", list.get(j).toString());                        
}
于 2012-10-23T13:01:40.377 に答える