什么是最准确的;声明与准备声明

时间:2015-04-21 00:55:11

标签: mysql jsp select prepared-statement

我正在研究这个jsp项目,顾问告诉我们使用预处理语句因为它比sql注入安全而不是语句。但他在mysql记录插入状态中提到了它。
wHEN我使用select mysql select query我通常用于语句。但是,作为新的想法,我更愿意准备声明。两者都工作得很好。
还有什么是最好的事情。
使用声明..

   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();
     }


谢谢。

2 个答案:

答案 0 :(得分:1)

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

使用该语句时,只有在完全相同(name = 1)时才重新使用它,或者在SQL Server的情况下,它被转换为"准备好的#34;语句(参数替换由SQL Server内部执行:这比确定查询计划花费的时间更少,但每次查询可能仍然花费你1/10000秒)。 Oracle做了类似于那些陈述的事情。

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

答案 1 :(得分:1)

准备好的陈述应该是最好的...也喜欢这篇文章http://www.percona.com/blog/2006/08/02/mysql-prepared-statements/