2015-04-21 123 views
-1

我正在研究这个jsp项目,出于顾问告诉我们使用准备好的声明,因为它比sql语句安全。但他在mysql记录插入状态中提到它。
wHEN我使用select mysql选择查询我通常用于语句。但是,随着新的想法,我更愿意准备发言。两者都工作得很好。
还有什么是最好的事情。
当使用声明..
什么是最准确的;声明VS准备好的声明

try{      
    Resultset rs2 = dbCon.createStatement().executeQuery("select max(grn_id) from grn"); 
     if (rs2.first()) { 
         int grn_id = rs2.getInt(1); 
     } 
    catch(Exception e){ 
     e.printstacktrace(); 
    } 


当使用事先准备好的声明..

Connection con = null; 
    PreparedStatement ps = null; 
    ResultSet rs = null; 
    String sql = "select * from item where name=?"; 

    try { 
     con = db.getConnection(); 
     ps = con.prepareStatement(sql); 
     ps.setString(1, name); 
     rs = ps.executeQuery(); 
     while (rs.next()) { 
          int grn_id = rs.getInt(1); 
     }catch(Exception e){ 
     e.printstacktrace(); 
    } 


谢谢。

+0

也不是“更准确”。他们都服从相同的语义。 – EJP

+0

@EJP但他们说准备好的声明对安全性有好处。对? –

回答

1

您正在征求意见。这总是很困难的: 这两个陈述(在所示的上下文中!)和准备好的陈述都是安全的。根据您的DBMS及其设置,准备好的语句有1个好处: DBMS可以在内部回收预准备语句及其执行,从而节省查询准备时间(即使每次都重新创建语句)。所以当名字是1或名字是2时,它会节省你的时间(在大多数情况下)。我们在这里谈论100秒到10秒。

当使用该语句时,只有在它完全相同(名称= 1)时才会重新使用,或者在SQL Server将其转换为“prepared”语句的情况下(参数替换由SQL Server内部执行:确定查询计划时花费的时间更少,但每次查询可能花费您1/10000秒)。 Oracle与这些语句做了类似的事情。

该语句的执行效果比准备好的语句要好: 在某些情况下,数据分布是这样的,例如name = 1会给出1MLN结果,在这种情况下,优化器选择使用索引扫描,但是name = 2给出了一个结果,其中索引查找会更好,并且优化器会选择该计划。 然而,在准备好的语句中,第一个选择的计划用于所有连续执行,因此范围扫描也将用于查找name = 2,这比正常查找要快。

+0

谢谢你的精彩答案。 –