JDBC中的CreateStatement和PreparedStatement之间的区别

use*_*252 1 java sql optimization jdbc

嗨,我正在尝试学习JDBC。这是我的问题:

PreparedStatement在JDBC中的用途是什么,因为我们也可以通过使用实现相同的效果createStatement();

我的意思是如果有这样的查询:

Select * from tbl_name where id = somevalue
Run Code Online (Sandbox Code Playgroud)

然后我们可以通过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){  ...  }
Run Code Online (Sandbox Code Playgroud)

使用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){ ... }
Run Code Online (Sandbox Code Playgroud)

由于这两个程序都能够执行相同的任务。

  • 为什么提供两种不同的方法?如果避免重复,循环似乎也很容易。
  • 谁能告诉我使用哪个好?
  • 他们每个人都有什么提供?
  • 它们之间有什么区别,哪一个可以优化代码?

Kal*_*ran 5

准备好的语句概念并非特定于Java,它是数据库概念。语句的预编译意味着,当您执行SQL查询时,数据库服务器将在执行实际查询之前准备一个执行计划,该执行计划将被缓存在数据库服务器中以供进一步执行。

预备报表的优点是:

  • 随着执行计划的缓存,性能会更好。
  • 这是对SQL注入进行编码的一种好方法,因为可以转义输入值。
  • 对于无绑定变量的语句,数据库可以自由地进行全面优化。单个查询将更快,但是缺点是您需要一直进行数据库编译,这比快速查询的好处还差。