JDBC中的Statement和PreparedStatement的区别

时间:2021-04-30 11:51:55

1>PreparedStatement用于处理动态SQL语句,在执行前会有一个预编译过程,这个过程是有时间开销的,虽然相对数据库的操作,该时间开销可以忽略不计,但是PreparedStatement的预编译结果会被缓存,下次执行相同的预编译语句时,就不需要编译,只要将参数直接传入编译过的语句执行代码中就会得到执行,所以,对于批量处理可以大大提高效率。

2>Statement每次都会执行SQL语句,相关数据库都要执行SQL语句的编译。

3>作为开发者,应该尽可能以PreparedStatement代替Statement,其原因如下:

(1)代码的可读性和可维护性。从代码比较中就应该能看出来;

JDBC中的Statement和PreparedStatement的区别
stmt.executeUpdate("insert into tb_name (col1,col2,col2,col4) values ('"+var1+"','"+var2+"',"+var3+",'"+var4+"')");//stmt是Statement对象实例

perstmt
= con.prepareStatement("insert into tb_name (col1,col2,col2,col4) values (?,?,?,?)");
perstmt.setString(
1,var1);
perstmt.setString(
2,var2);
perstmt.setString(
3,var3);
perstmt.setString(
4,var4);
perstmt.executeUpdate();
//prestmt是 PreparedStatement 对象实例
JDBC中的Statement和PreparedStatement的区别

(2)PreparedStatement尽最大可能提高性能。

(3)极大的提高了安全性。

恶意SQL语法

String sql = "select * from tb_name where name= '"+varname+"' and passwd='"+varpasswd+"'"; 
如果我们把[' or '1' = '1]作为varpasswd传入进来.用户名随意,看看会成为什么? 
select * from tb_name = '随意' and passwd = '' or '1' = '1'; 
因为'1'='1'肯定成立,所以可以任何通过验证.更有甚者: 
把[';drop table tb_name;]作为varpasswd传入进来,则: 
select * from tb_name = '随意' and passwd = '';drop table tb_name;有些数据库是不会让你成功的,但也有很多数据库就可以使这些语句得到执行. 
而如果你使用预编译语句.你传入的任何内容就不会和原来的语句发生任何匹配的关系.只要全使用预编译语句,你就用不着对传入的数据做任何过虑.而如果使用普通的statement,有可能要对drop,;等做费尽心机的判断和过虑.