对于只执行一次的SQL语句选择Statement是最好的. 相反, 如果SQL语句被多次执行选用PreparedStatement是最好的.
PreparedStatement的第一次执行消耗是很高的. 它的性能体现在后面的重复执行. 例如, 假设我使用Employee ID, 使用prepared的方式来执行一个针对Employee表的查询. JDBC驱动会发送一个网络请求到数据解析和优化这个查询. 而执行时会产生另一个网络请求. 在JDBC驱动中,减少网络通讯是最终的目的. 如果我的程序在运行期间只需要一次请求, 那么就使用Statement. 对于Statement, 同一个查询只会产生一次网络到数据库的通讯.
对于使用PreparedStatement池的情况下, 本指导原则有点复杂. 当使用PreparedStatement池时, 如果一个查询很特殊, 并且不太会再次执行到, 那么可以使用Statement. 如果一个查询很少会被执行,但连接池中的Statement池可能被再次执行, 那么请使用PreparedStatement. 在不是Statement池的同样情况下, 请使用Statement.

PreparedStatement对象可以防止sql注入,而Statement不能防止sql注入
区别:PreparedStatement可以使用占位符,是预编译的,批处理比Statement效率高

补充说明

Java提供了 Statement、PreparedStatement 和 CallableStatement三种方式来执行查询语句,其中 Statement 用于通用查询, PreparedStatement 用于执行参数化查询,而 CallableStatement则是用于存储过程。

在java的数据库编程当中,一个Statement只能对应产生一个ResultSet。如果在一个ResutSet尚未关闭的时候再使用另外一个sql语句产生另外一个ResultSet的时候之前建立的ResultSet就会强制关闭。
意思就是 必须执行完一个resultset 完之后 再对另一个resultset进行定义
例:
`ResultSet rs = ps.executeQuery();
while (rs.next()){
String name = rs.getString(2);
int id = rs.getInt(1);
System.out.println(“id:”+id+“,name:”+name);
}
rs.close();

ResultSet rs2 = ps.executeQuery(“select * from test.score”);
while (rs2.next()){
String sid = rs2.getString**(1);
String c_id = rs2.getString
(2);
int s_score = rs2.getInt
(3);
System.
_out
.println(“sid:”+rs2.getObject(1)+“,c_id:”+c_id+“,s_score:”+s_score);
ResultSetMetaData md = rs2.getMetaData
();
System.
_out
.println(md.getColumnCount());
}**`