1、PreparedStatement接口继承Statement,PreparedStatement实例包含已编译的SQL语句,所以其执行速度快于Statement对象。
2、PreparedStatement是Statement的子类,同样继承Statement所有功能。
三种方法:execute、executeQuery、executeUpdate在PreparedStatement中已经被更改,使之不在需要参数。
3、不用Statement的原因:
1)代码的可读性和可维护性:
如下代码:
stat.executeUpdate("insert into tb_name(col1,col2,col3,col4)
values('"+var1+"','"+var2+"','"+var3+"','"+var4+"')")//stat是Statement的实例化对象
prepastat.executeUpdate("insert into tb_name (col1,col2,col3,col4)
values (?,?,?,?)")
prepastat.setString(1,value1));
prepastat.setString(2,value2));
prepastat.setString(3,value3));
prepastat.setString(4,value4));//prepastat是PreparedStatement的对象实例
对比得第二个完胜
2)PreparedStatement尽可能提高性能
对于整个DB来说,语句再被编译后执行代码会被缓存,则下次只要是预编译语句与缓存相匹配,就可以不需要编译,
从缓存直接调用,将参数直接传入执行代码中直接执行,而Statement语句基本不可能相同,所以基本每次都要再编译。
例如:
insert into tb_name (col1,col2)values(18,22);
insert into tb_name (col1,col2)values(18,25);
这两个语句相同操作,但是仅因为数据不同,所以整个语句不匹配,会在编译后缓存。
//并不是所有的预编译语句都会被缓存,数据库会根据一些策略比如频率等来判断是否缓存。
3)极大地提高安全性能
防注入:
例如:String sql = "select * from tb_name where user_name ='"+user_name
+"'and password = '"+password+"'"
如果将"'or '1'= '1'"当做参数传进去就会出现密码验证永远正确。
注:
1.executeQuery:返回ResultSet结果集
2.executeUpdate:执行任意SQL语句,可以为insert,update或delete,可以不返回任何语句
3.excute:可以执行任何SQL语句返回一个Boolean类型,表示是否返回了ResultSet。