PreparedStatement和Statement(数据库优

2018-08-02  本文已影响0人  莫小归

参考:https://www.cnblogs.com/weiyi1314/p/6638483.html

一、技术原理

PreparedStatement接口继承Statement,并有两方面不同:
一是PreparedStatement对象已预编译过,其执行速度要快于Statement对象。需要多次执行的SQL语句应创建为PreparedStatement对象以提高效率;
二是SQL语句在创建时可使用IN参数及其配套的setXXX方法设置SQL语句中的参数,Statement的三种执行方法execute/executeQuery/executeUpdate不再需要执行参数。

二、PreparedStatement的优点

1.增强代码的可读性和可维护性

Statement设置的SQL语句

stmt.executeUpdate("insert into tb_name(col1,col2,col2,col4) values('"+var1+"','"+var2+"',"+var3+",'"+var4+"')");

PreparedStatement设置的SQL语句

  perstmt=con.prepareStatement("insertintotb_name(col1,col2,col2,col4)values(?,?,?,?)");
  perstmt.setString(1,var1);
  perstmt.setString(2,var2);
  perstmt.setString(3,var3);
  perstmt.setString(4,var4);
  perstmt.executeUpdate();

2.提高运行性能

数据库编译器在执行PreparedStatement代码后,将会缓存该语句。下次调用相同的预编译语句不再进行编译,直接将参数传入编译过的语句执行代码中。
而Statement语句仅仅是因为传入参数不同,数据库编译器必须重新编译,如下述两条语句:

insert into tb_name(col1,col2) values('11','22');
  insert into tb_name(col1,col2) values('11','23');

3.提高数据库安全性

恶意SQL语句:
如下语句

String sql="select * from tb_name where name = '" + varname + "'and passwd='" + varpasswd + "'";

如果将varpassword值设为['or'1'='1],SQL语句变为

select * from tb_name = '随意'  and passwd='' or '1'='1';

因为‘1=1‘一直成立,该条语句将被执行,数据库受到SQL注入攻击。
而使用预编译语句时,你传入的内容就不会和原语句发生任何匹配关系。只要使用PreparedStatement,就不用对传入数据进行任何过滤,也免于SQL注入的威胁。

欲穷千里目,更上一层楼

上一篇下一篇

猜你喜欢

热点阅读