PreparedStatement 接口继承了Statement,因此PreparedStatement比Statement功能更强大,有人主张,在JDBC应用中,应该始终以PreparedStatement代替Statement。也就是说,在任何时候都不要使用Statement。

大部分关系型数据库通过JDBC进行SQL查询,分以下4步。

1.转换SQL。

2.编译SQL。

3.优化数据查询路径。

4.执行最优化的查寻,并返回数据。

Statement对于每一个SQL查询总是处理这4步。而PreparedStatement对象已经预先执行了步骤1-3,这样的话,当PreparedStatement只需要做查询动作,因此比Statement会快很多。并且PreparedStatement能够防止sql注入***,可以使用?作为参数,然后调用方法setXxx()来为参数赋值

 

   
   
   
   
  1. preparedStatement = connection.prepareStatement("INSERT INTO Person (name, email, birthdate, photo) VALUES (?, ?, ?, ?)"); 
  2. preparedStatement.setString(1, person.getName()); 
  3. preparedStatement.setString(2, person.getEmail()); 
  4. preparedStatement.setTimestamp(3, new Timestamp(person.getBirthdate().getTime())); 
  5. preparedStatement.setBinaryStream(4, person.getPhoto()); 
  6. preparedStatement.executeUpdate(); 

 

对于一些非字符串的值,比如Date, Time, Timestamp, BigDecimal, InputStream (Blob) 等值,也可以在循环内调用setObject方法来设置值。如下:

 

   
   
   
   
  1. public static void setValues(PreparedStatement preparedStatement, Object... values) throws SQLException { 
  2.     for (int i = 0; i < values.length; i++) { 
  3.         preparedStatement.setObject(i + 1, values[i]); 
  4.     }