あなたのコードは、メモリ内の文字列インスタンス(**を使用して)強調表示:
あなたは+ 4 "'" 合計(4つの文字列変数に持つ変数this.custName、this.custNumなどを数える
private String insertStatement() {
StringBuffer sb = new StringBuffer(
**"insert into CUSTOMER (NAME, NUMBER, CITY, STATE) values ("**);
sb.append(**"'"** + this.custName + **"',"**);
sb.append(**"'"** + this.custNum + **"',"**);
sb.append(**"'"** + this.custCity + **"',"**);
sb.append(**"'"** + this.custState + **")"**);
return sb.toString();
}
この関数が呼び出されたときにメモリ内に17個の文字列オブジェクトインスタンスが連結されたときに+ 4 "'、" +4文字列インスタンスが作成されます。
private String insertStatement() {
StringBuffer sb = new StringBuffer(
"insert into CUSTOMER (NAME, NUMBER, CITY, STATE) values (");
String quote = "'";
String endQuoteComma = "',";
String endingBracket = ")";
sb.append(quote);
sb.append(this.custName);
sb.append(endQuoteComma);
sb.append(quote);
sb.append(this.custNum);
sb.append(endQuoteComma);
sb.append(quote);
sb.append(this.custCity);
sb.append(endQuoteComma);
sb.append(quote);
sb.append(this.custState);
sb.append(endingBracket);
return sb.toString();
}
このバージョンでは、メモリ内の文字列の8つの例では、4つの変数+ 3クォート、endquotecomma、endbracket変数+ 1列バッファインスタンス
なぜ作るのだろうか? 文字列は不変であるため、作成した文字列を変更または変更することはできません。
ここで重要ですか?ループ内で何百万回も呼び出さない限り、おそらくそれは約17万回になるでしょう。インスタンスがメモリ文字列オブジェクトに含まれていて、メモリが不足する可能性があります。
また、このコメントは非常に有効で、この場合はPrepared Statementを使用する必要があります。文字列バッファを使用する利点を強調したかっただけです。
はい、['PreparedStatement'](https://docs.oracle.com/javase/7/docs/api/java/sql/PreparedStatement.html)を使用し、自分自身をSQLインジェクションに開放しないでください。 – khelwood
'PreparedStatement'のようなものを使用できない理由はありますか?次に、PreparedStatement pstmt = databaseConnection.prepareStatement( "Customer、name、city、state)の値(?、?、?、?)")に挿入し、その後にpstmt.setString( 1、this.custName); – Orin
私はデータベースでの作業経験が豊富なので、 'PreparedStatement'がオプションであるかどうかわかりませんでした!私は見てみましょう。 –