1、代码可读性和可维护性
statement是将参数拼接到sql语句,preparedstatement则是以“?”代替参数位再以传参的形式设置参数。其实无所谓好坏看个人习惯2、
2、性能
许多数据库会对预编译的语句进行缓存,以备重复调用。下次调用同一语句只要将参数传入编译过的语句执行就行不用再次编译(类似函数)。而statement即使是同一操作,但是每次操作数据不同,使整个语句匹配机会很小。事实上没有数据库会对普通语句编译后的执行代码缓存
在jdbc中减少网络通讯是最终目的,如果一个语句只执行一次使用statement效率高,因为只会产生一次网络到数据库的通讯,而prepareds要产生两次网络请求,第一次请求到数据库解析和优化语句消耗很大,第二次执行语句,它的性能体现在后面的重复执行
当然不是所有预编译语句一定被缓存,数据库本身有自己的策略
3、安全性
preparedstatement可以防止sql注入攻击
preparedstatement的batch功能
对比以下代码
//多次执行
PreparedStatement ps = conn.prepareStatement(
"INSERT into employees values (?, ?, ?)");
for (n = 0; n < 100; n++) {
ps.setString(name[n]);
ps.setLong(id[n]);
ps.setInt(salary[n]);
ps.executeUpdate();
}
//使用batch
PreparedStatement ps = conn.prepareStatement(
"INSERT into employees values (?, ?, ?)");
for (n = 0; n < 100; n++) {
ps.setString(name[n]);
ps.setLong(id[n]);
ps.setInt(salary[n]);
ps.addBatch();
}
ps.executeBatch();
上面一种方法需要发生101次网络请求,使用batch只要2次
oracle10g 的jdbc driver限制最大batch size是16383条