1

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

JDBC中的Use是什么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){ ... }

因为这两个程序都能够完成相同的任务。

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

2 回答 2

10

准备好的语句概念不是 Java 特有的,它是一个数据库概念。语句预编译是指当你执行一条SQL查询时,数据库服务器会在执行实际查询之前准备一个执行计划,这个执行计划会被缓存在数据库服务器中以供进一步执行。

准备好的语句的优点是:

  • 随着执行计划被缓存,性能会更好。
  • 这是一种针对 SQL 注入进行编码的好方法,因为它会转义输入值。
  • 对于没有未绑定变量的语句,数据库可以自由优化。单独的查询会更快,但缺点是你需要一直做数据库编译,这比查询更快的好处还要糟糕。
于 2013-07-30T15:16:25.150 回答
2

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

于 2013-07-30T15:02:06.663 回答