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()来为参数赋值
- preparedStatement = connection.prepareStatement("INSERT INTO Person (name, email, birthdate, photo) VALUES (?, ?, ?, ?)");
- preparedStatement.setString(1, person.getName());
- preparedStatement.setString(2, person.getEmail());
- preparedStatement.setTimestamp(3, new Timestamp(person.getBirthdate().getTime()));
- preparedStatement.setBinaryStream(4, person.getPhoto());
- preparedStatement.executeUpdate();
对于一些非字符串的值,比如Date, Time, Timestamp, BigDecimal, InputStream (Blob) 等值,也可以在循环内调用setObject方法来设置值。如下:
- public static void setValues(PreparedStatement preparedStatement, Object... values) throws SQLException {
- for (int i = 0; i < values.length; i++) {
- preparedStatement.setObject(i + 1, values[i]);
- }
- }
本文转自cnn23711151CTO博客,原文链接: http://blog.51cto.com/cnn237111/1131869
,如需转载请自行联系原作者