资料库操作为什么选PreparedStatement而不是Statement?
一、提高代码可读性,和可维护性
为什么?直接上代码statement.executeQuery("select id,name,age,sex from user where id>"+"id"+and name
like %"+subname+"%and sex="+sex+");
上面是使用statement对象的代码
pstatement=connection.preparedStatement("select id,name,sex from user where id>?and
name like ? and sex=?");
pstatement.setString(1,id);
pstatement.setString(2,name);
pstatement.setString(3,sex);
pstatement.executeQuery();
上面是使用PreparedStatementd对象的代码
虽然使用PreparedStatementd对象的代码多了几行,但是显得更为简洁。调理更为清晰,便于修改。
二、有助于提高性能
PreparedStatementd对象在创建时就指定了动态的SQL,因此这些SQL被编译之后缓存起来了。等下一次再执行相同的预编译语言时,就无需再对其进行编译,只要将参数传入就可以执行。动态SQL使用了「?」作为占位符,因此预编译语句的匹配率要比Statement对象使用的SQL语句大得多。
三、提高复用性
因为可以在占位符处,每次通过传入不同的参数对一个PreparedStatementd对象进行调用。
如果是使用statement对象,那么每次要执行不同条件的SQL语句时,需要重新创建statement对象。
四、提高安全性
如果使用Statement对象,就很容易收到SQL注入攻击。
如
String name="刘耀";
String sql="select * from user where name="+name+"";
statement.executeQuery(sql);
假设我将
String name=";drop table user;";
那么实际上
执行的sql语句成了:select * from user where name=;dorp table user;
资料库中user表就会被删除。但是使用PreparedStatement对象就不会有这样的危险。
推荐阅读: