PreparedStatement比Statement有什么优势?
的有关信息介绍如下:一、PreparedStatement相比于Statement,有三个优点:一)代码的可读性和可维护性。从代码来看,用PreparedStatement来代替Statement会使代码多出几行,但这样的代码无论从可读性还是可维护性上来说,都比直接用Statement的代码高很多档次。 二)PreparedStatement尽最大可能提高性能。 每一种数据库都会尽最大努力对预编译语句提供最大的性能优化,因为预编译语句有可能被重复调用,所以语句在被DB的编译器编译后的执行代码被缓存下来,那么下次调用时只要是相同的预编译语句就不需要编译,只要将参数直接传入编译过的语句执行代码中(相当于一个函数)就会得到执行。这并不是说只有一个Connection中多次执行的预编译语句被缓存,而是对于整个DB中,只要预编译的语句语法和缓存中匹配,那么在任何时候就可以不需要再次编译而可以直接执行。而statement的语句中,即使是相同一操作,而由于每次操作的数据不同所以使整个语句相匹配的机会极小,几乎不太可能匹配。比如: insert into tb_name (col1,col2) values ('11','22'); insert into tb_name (col1,col2) values ('11','23'); 即使是相同操作但因为数据内容不一样,所以整个个语句本身不能匹配,没有缓存语句的意义,事实是没有数据库会对普通语句编译后的执行代码缓存。 当然并不是所有预编译语句都一定会被缓存,数据库本身会用一种策略,比如使用频度等因素来决定什么时候不再缓存已有的预编译结果,以保存有更多的空间存储新的预编译语句。 用Statement对象时,每次执行一个SQL命令,都会对它进行解析编译,而PreparedStatement对象在多次执行同一个SQl语句时都只解析编译一次。PreparedStatement对象“就像一条生产线,批量生产同一型号的产品速度非常快。”这样便可极大地减少资源开销。三)极大地提高了安全性。传递给PreparedStatement对象的参数可以被强制进行类型转换,使开发人员可以确保在插入或查询数据时与底层的数据库格式匹配。在公共Web站点环境下,有恶意的用户会利用那些设计不完善的、不能正确处理字符串的应用程序来个SQl注入,那就有麻烦。二、例子:两者的代码:1)Statement代码 Statement stmt = con.createStatement();String sql = "INSERT INTO dept VALUES (12, 'GAME', 'BeiJing')";stmt.executeUpdate(sql);2)PreparedStatement代码 String sql = "INSERT INTO dept VALUES ( ?, ?, ? )";PreparedStatement pre = con.prepareStatement(sql);pre.setInt(1, deptno); //部门编号pre.setString(2,dname); //部门名称pre.setString(3,location); //部门地址pre.executeUpdate();