参考: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注入的威胁。
欲穷千里目,更上一层楼