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

What is the most accurate ; statement vs prepared statement

我正在做这个 jsp 项目,顾问告诉我们使用准备好的语句,因为它比语句更安全 sql 注入。但是他在mysql记录插入状态中提到了。
当我使用 select mysql select 查询时,我通常会使用语句。但作为新想法,我也更喜欢准备好的声明。两者都工作得很好。
仍然是最好的事情。
使用语句时..

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


谢谢你。

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

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

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