1

こんにちは、JDBC を学習しようとしています。ここに私の質問があります:-

JDBCでの使用とは、使用PreparedStatementしても同じ効果が得られるためcreateStatement();です。

つまり、次のようなクエリがある場合です。

Select * from tbl_name where id = somevalue

PreparedStatement次に、 と の両方でそれを達成できcreateStatement()ます。次のように:

使用CreateStatement():

try {
      DataInputStream dis=new DataInputStream(System.in);
      System.out.println("Enter id :- ");
      int id=Integer.parseInt(dis.readLine());
      String q="Select * from tbl_name where id="+id;
      Statement stmt = conn.createStatement();
      ResultSet rs = stmt.executeQuery(q);
      while(rs.next()) {
         //fetching part
     }
} catch(Exception ex){  ...  }

使用PreparedStatement:

 try {
        PreparedStatement preStatement=conn.prepareStatement("Select * from tbl_name where id=?");
        DataInputStream dis=new DataInputStream(System.in);
        System.out.println("Enter id:- ");
        int id=Integer.parseInt(dis.readLine());
        preStatement.setInt(1, id);
        ResultSet result = preStatement.executeQuery();      
        while(result.next()){
          // fetch the data
        }
    }catch(Exception ex){ ... }

これらのプログラムはどちらも同じタスクを実行できるためです。

  • 2 つの異なる方法が提供されているのはなぜですか? また、繰り返しを避けることが答えであれば、ループは簡単なようです。
  • どれが使いやすいか教えてもらえますか?
  • それぞれの規定は何ですか?
  • それらの違いは何ですか?また、どちらがコードを最適化しますか?
4

2 に答える 2

10

プリペアド ステートメントの概念は Java に固有のものではなく、データベースの概念です。ステートメントのプリコンパイルとは、SQL クエリを実行するときに、データベース サーバーが実際のクエリを実行する前に実行計画を準備し、この実行計画がデータベース サーバーにキャッシュされてさらに実行されることを意味します。

準備済みステートメントの利点は次のとおりです。

  • 実行計画がキャッシュされると、パフォーマンスが向上します。
  • 入力値をエスケープするため、SQL インジェクションに対してコーディングするのに適した方法です。
  • バインドされていない変数のないステートメントに関しては、データベースは自由に最大限に最適化できます。個々のクエリは高速になりますが、データベースのコンパイルを常に実行する必要があるという欠点があり、これは高速なクエリの利点よりも悪いです。
于 2013-07-30T15:16:25.150 に答える
2

createStatement を使用すると、基になるデータベースは、ステートメントが実行されるたびに、渡された選択クエリを解析してコンパイルする必要があります。これは、パフォーマンスに影響を与える可能性があります。クエリロジックを準備済みステートメントに「保存」し、ステートメントが実行されるたびに、クエリの変数部分である可能性があるクエリパラメーターを渡すだけです。

于 2013-07-30T15:02:06.663 に答える