JDBC中的CreateStatement和PreparedStatement之间的区别

时间:2013-07-30 14:47:25

标签: java sql optimization jdbc

您好我正在尝试学习JDBC。 这是我的问题: -

在JDBC中使用PreparedStatement是什么因为我们也可以通过使用createStatement();来达到同样的效果。

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

Select * from tbl_name where id = somevalue

然后我们可以通过PreparedStatementcreateStatement()来实现它。如下:

使用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 个答案:

答案 0 :(得分:5)

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

准备陈述的好处是:

  • 随着执行计划的缓存,性能会更好。
  • 这是对SQL注入进行编码的好方法,因为它会转义输入值。
  • 当涉及没有未绑定变量的Statement时,数据库可以自由地进行全面优化。单个查询会更快,但缺点是您需要一直进行数据库编译,这比更快查询的好处更糟糕。

答案 1 :(得分:1)

使用createStatement时,每次执行语句时,底层数据库都必须解析并编译传递的select查询。这可能会影响性能。您可以在预准备语句中“保存”查询逻辑,并在每次执行语句时传入查询参数,这些参数可能是查询的可变部分。