1

アプローチ 1 :

Connection connection=Connector.getConnection();
PreparedStatement ps1=connection.prepareStatement("insert into tbl_invtry(part_id,part_name)
                                                  values(?,?,)");
ps1.setString(1,action.getPart_id());
ps1.setString(2,action.getPart_name());

アプローチ 2 :

DAO dao = new DAOImpl(); //DB connection
String query="insert into tbl_entrp_proj(ASPECT_SRC_ID,PRNT_PROJ_ID)values('" + 
                                         project.getASPECT_SRC_ID() + "','" + 
                                         project.getPRNT_PROJ_ID() + "')";
boolean b = dao.insertQuery(query);  

どれが一番いいのか、その理由を教えてください。前もって感謝します。

4

2 に答える 2

2

Ashwin と dasblinkenlight が述べたように、SQL インジェクションが懸念事項です。

アプローチ 1 では、パラメーター化されたクエリを使用してユーザー入力をエスケープし、SQL インジェクションを防ぎました。アプローチ 2 では、ユーザーがデータベースに直接挿入される値を提供することを信頼しました。

SQL インジェクション ステートメントは挿入時には問題にならない可能性がありますが、選択 (または他のクエリ) ではデータとデータベースに大混乱をもたらす可能性があることに注意してください。

これらの理由から、アプローチ 1 を使用しないことは、せいぜい無責任であり、最悪の場合は破滅的です。

アプローチ 1 が最適である理由の 2 つ目の理由については、準備済みステートメントのパフォーマンス上の利点について説明し、SQL インジェクションから保護することの重要性を強調している この質問を見てください。

于 2013-06-25T18:53:55.027 に答える
2

次の理由により、私は最初のアプローチを選択します。

  1. より効率的です。PreparedStatement をコンパイルして、データベースで再利用できます。
  2. 安全。PreparedStatement を使用する場合、エンコーディングや SQL インジェクションについて心配する必要はありません。

ただし、Hibernate のような ORM フレームワークを使用する 3 番目のアプローチを検討します。

于 2013-06-25T18:52:50.947 に答える