首先是效率性 java
PreparedStatement能够尽量的提升访问数据库的性能,咱们都知道数据库在处理SQL语句时都有一个预编译的过程,而预编译对象就是把一些格式固定的SQL编译后,存放在内存池中即数据库缓冲池,当咱们再次执行相同的SQL语句时就不须要预编译的过程了,只需DBMS运行SQL语句。因此当你须要执行Statement对象屡次的时候,PreparedStatement对象将会大大下降运行时间,特别是的大型的数据库中,它能够有效的也加快了访问数据库的速度。
其次,使用PreparedStatement对象能够大大提升代码的可读性和可维护性 sql
例如咱们在向数据库插入数据: 数据库
一种是使用Statement对象 安全
java.sql.Statement stmt=conn.createStatement(); 性能
stmt.executeUpdate("insert into student (name,id,number,count) values ('"+var1+"','"+var2+"',"+var3+",'"+var4+"')");
另外一种是使用PreparedStatement对象 spa
String sql ="insert into student values(null,?,?,?)"; 设计
java.sql.PreparedStatement pstmt=conn.preparedStatement(sql); 对象
pstmt.setString(1,var1);
pstmt.setString(2,var2);
pstmt.setString(3,var3);
pstmt.setString(4,var4);
pstmt.executeUpdate(); 内存
使用占位符?代替 开发
将参数与SQL语句分离出来,这样就能够方便对程序的更改和延续,一样,也能够减小没必要要的错误。
最后就是安全性了。 如下转自百度文库:传递给PreparedStatement对象的参数能够被强制进行类型转换,使开发人员能够确保在插入或查询数据时与底层的数据库格式匹配。 当处理公共Web站点上的用户传来的数据的时候,安全性的问题就变得极为重要。传递给PreparedStatement的字符串参数会自动被驱动器忽略。最简单的状况下,这就意味着当你的程序试着将字符串“D'Angelo”插入到VARCHAR2中时,该语句将不会识别第一个“,”,从而致使悲惨的失败。几乎不多有必要建立你本身的字符串忽略代码。 在Web环境中,有恶意的用户会利用那些设计不完善的、不能正确处理字符串的应用程序。特别是在公共Web站点上,在没有首先经过PreparedStatement对象处理的状况下,全部的用户输入都不该该传递给SQL语句。此外,在用户有机会修改SQL语句的地方,如HTML的隐藏区域或一个查询字符串上,SQL语句都不该该被显示出来。 在执行SQL命令时,咱们有二种选择:可使用PreparedStatement对象,也可使用Statement对象。不管多少次地使用同一个SQL命令,PreparedStatement都只对它解析和编译一次。当使用Statement对象时,每次执行一个SQL命令时,都会对它进行解析和编译。