java中PreparedStatement与Statement相比具有什么优势?
5个回答
2013-07-05
展开全部
1、用PreparedStatement来代替Statement会使代码多出几行,但这样的代码无论从可读性还是可维护性上来说.都比直接用Statement的代码高很多档次2、PreparedStatement尽最大可能提高性能。PreparedStatement是预编译语句;预编译语句有可能被重复调用,语句在被编译器编译后的执行代码被缓存下来,下次调用时只要是相同的预编译语句就不需要编译,只要将参数直接传入编译过的语句执行代码中就会得到执行。3、极大地提高了安全性,可以有效的避免SQL注入。
2013-07-05
展开全部
PreparedStatement与Statement相比更安全,做相同类型的sql语言速度要快。
而且我觉得PreparedStatement好像书写起来也比较便捷,因为……=?在具体操作中比=……
操作起来要明了些 尤其是报错等时候。因为sql语言当做一个String,错了eclipse也不报错的嘛
越简短越好。我最近刚好用的很多,这是我的体会,希望对你有帮助
而且我觉得PreparedStatement好像书写起来也比较便捷,因为……=?在具体操作中比=……
操作起来要明了些 尤其是报错等时候。因为sql语言当做一个String,错了eclipse也不报错的嘛
越简短越好。我最近刚好用的很多,这是我的体会,希望对你有帮助
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2013-07-05
展开全部
在JDBC应用中,如果你是稍有水平开发者,在任何时候都不要用Statement,PreparedStatement不管在安全性,效率性,维护性都比statement好很多
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
PreparedStatement 预编译,一次编译,到处执行,效率高,并且参数可以使用占位符如(?,:test),安全些.
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2013-07-05
展开全部
2.预编译PreparedStatement 使用范围:当执行相似sql语句的次数比较多(例如用户登陆,对表频繁操作..)语句一样,只是具体的值不一样,被称为动态SQL优点:语句只编译一次,减少编译次数。提高了安全性(阻止了SQL注入)缺点: 执行非相似SQL语句时,速度较慢。原理:相似SQL只编译一次,减少编译次数名词解释:SQL注入:select * from user where username="张三" and password="123" or 1=1;前面这条语句红色部分就是利用sql注入,使得这条词句使终都会返回一条记录,从而降低了安全性。事例执行过程: public void exec2(Connection conn){ try { Long beginTime = System.currentTimeMillis(); conn.setAutoCommit(false);//手动提交 PreparedStatement pst = conn.prepareStatement("insert into t1(id) values (?)"); for(int i=0;i<10000;i++){ pst.setInt(1, i); pst.execute(); } conn.commit(); Long endTime = System.currentTimeMillis(); System.out.println("Pst用时:"+(endTime-beginTime)+"秒");//计算时间 pst.close(); conn.close(); } catch (SQLException e) { e.printStackTrace(); } }执行时间:Pst用时:14秒 3.使用PreparedStatement + 批处理使用范围:一次需要更新数据库表多条记录优点:减少和SQL引擎交互的次数,再次提高效率,相似语句只编译一次,减少编译次数。提高了安全性(阻止了SQL注入)缺点:原理:批处理: 减少和SQL引擎交互的次数,一次传递给SQL引擎多条SQL。名词解释:PL/SQL引擎:在oracle中执行pl/sql代码的引擎,在执行中发现标准的sql会交给sql引擎进行处理。SQL引擎:执行标准sql的引擎。事例执行过程:public void exec3(Connection conn){ try { conn.setAutoCommit(false); Long beginTime = System.currentTimeMillis(); PreparedStatement pst = conn.prepareStatement("insert into t1(id) values (?)"); for(int i=1;i<=10000;i++){ pst.setInt(1, i); pst.addBatch();//加入批处理,进行打包 if(i%1000==0){//可以设置不同的大小;如50,100,500,1000等等 pst.executeBatch(); conn.commit(); pst.clearBatch(); } } pst.executeBatch(); Long endTime = System.currentTimeMillis(); System.out.println("pst+batch用时:"+(endTime-beginTime)+"毫秒"); pst.close(); conn.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } }执行时间:pst+batch用时:485毫秒
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询