PreparedStatement接口將程序員所創建的SQL語句保存為已編譯格式,予statement對象相比,這些SQL語句執行效率更高.PreparedStatement對象也比Statement對象更加靈活,因為PreparedStatement可以指定參數,者使得程序可以使用不同的參數值來執行相同的查詢

解决方案 »

  1.   

    reparedStatement對象也比Statement對象更加靈活,因為PreparedStatement可以指定參數.如果使用statement語句,則程序必須為每一個新的sql語句創鍵一個新的String
      

  2.   

    可以家参数啊,PreparedStatement更加灵活了,而且速度比Statement要快!呵呵,刚刚用过!
      

  3.   

    to 108041217(金箔) 
      thx ,但是我的另一个程序导致这个数据库连接程序必须使用ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY
      这两个参数,至少TYPE_SCROLL_SENSITIVE是必须要用的。
    现在换成了PerparedStatement后似乎只能直接读sqlstr...
      

  4.   

    to alexwan(生如夏花)请问 你是怎么加的参数,怎么弄都出错...
      

  5.   

    prep = conn.prepareStatement("Select name from table where id=?", ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
    prep.setInt(1, id);
    ResultSet rs = prep.executeQuery();
    ...这样有什么问题啊,参数都是在SQLString中以?表示
      

  6.   

    一些ResultSet的實現不支持可滾動的和(或)可更新的ResultSet.
    一些jdbc驅動程序支持可更新的ResultSet對象,即吮許程序使用ResultSet接口的方法插入,更新和刪除紀錄
      

  7.   

    to  ChDw(米) 按照你的方法总算编译过去了,
    prep = conn.prepareStatement(sqlstr,ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
    ResultSet rs = prep.executeQuery();
    我把这个bean放在用户登陆里面做测试,结果输入校验结果是对的,但是如果用户密码是"' or 1=1--"
    的话页面就会抛出NullPointerException,这又是什么原因呢?
      

  8.   

    但是如果用户密码是"' or 1=1--"
    應該是你寫法有問題吧.
    prepareStatement參數都用"?"
    然後用SetXXX();
      

  9.   

    to 108041217(金箔)我把这个当数据库连接的bean,所以是不能给出"?"参数的,因为要考虑各种不同的情况。
      

  10.   

    ?参数用setXXX方法来填充到sql查询语句中。
    然后,可以通过函数调用的时候传参过来,更改?的值。
    不管怎么样,你每次访问数据库的时候,sql里面要插的值是一定的,你就在jsp页面中得到那个值,然后传到一个javabean中。然后这个javabean去访问数据库操作的bean(把参数的值也带过去)。这样就可以实现读取数据库了。然后这个javabean又可以把调用的结果返回到jsp的页面中。这个方法应该是可行的。
      

  11.   

    to 2008scott()你的方案:
    1.把sqlstr 例如:"select * from *** where ***=?"  放到一个bean里
    2.把sqlstr的?参数  也放到这个bean里  
    3.然后用这个bean去操作数据库
    是吗?那摸这个bean他到底做的是什么工作呢?
      

  12.   

    to Jomper(Jr.) 我理解的bean就是在前台JSP和数据库之间建立联系,使相关的变量得以传送。
    如果把访问数据库的语句直接写在JSP里面,也可以,但这不符合分层的要求。表示-业务-数据库。这个层次是要分的。
    另外,bean还可以帮助你得到JSP页面里面的任何参数。
      

  13.   

    to 2008scott()   可能是我把问题弄复杂了。
      我有一个数据库连接的bean,于是我把所有的sqlstr都交给这个bean来execute,最初是用Statement来建立会话。但是后来发现有sql注入漏洞,于是我改用PerparedStatment来创建会话,但是用PerparedStatment来处理sqlstr是需要参数的,而且参数的数量不能确定,这样我就很难用一个bean来处理所有的数据库操作。
      我试过用PerparedStatment不给出"?"就处理sqlstr,就用户登陆来说一般的输入内容是没有问题的。但是如果我的输入内容中包含"' or 1=1--"就会抛出NullPointerException...
      我还是想用一个bean来完成sqlstr的execute,现在的问题似乎只是输入"' or 1=1--"会出错。怎么才能避免出错?
      

  14.   

    接上文:
      当然如果直接用Statement来建立会话,"' or 1=1--"就成了万能密码,没有任何安全性可言了...
      

  15.   

    可以加参数,PreparedStatement更加灵活,而且速度比Statement要快
      

  16.   

    楼主说:认真的看下面的内容,然后给出可行性方案的得80分"可能是我把问题弄复杂了。
      我有一个数据库连接的bean,于是我把所有的sqlstr都交给这个bean来execute,最初是用Statement来建立会话。但是后来发现有sql注入漏洞,于是我改用PerparedStatment来创建会话,但是用PerparedStatment来处理sqlstr是需要参数的,而且参数的数量不能确定,这样我就很难用一个bean来处理所有的数据库操作。
      我试过用PerparedStatment不给出"?"就处理sqlstr,就用户登陆来说一般的输入内容是没有问题的。但是如果我的输入内容中包含"' or 1=1--"就会抛出NullPointerException...
      我还是想用一个bean来完成sqlstr的execute,现在的问题似乎只是输入"' or 1=1--"会出错。怎么才能避免出错?
    "
      

  17.   

    prep = conn.prepareStatement("Select name from table where id=?", ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
    prep.setInt(1, id);
    ResultSet rs = prep.executeQuery();
    ...还是这个好至于你说的注入问题,我觉得应该先参数检查吧
      

  18.   

    楼上的是标准的做法,但是如果像你这样 PerparedStatment和Connaction就不能封装到一个bean里面了...难道所有的PerparedStatment会话应用都是在jsp页面里面处理的数据库连接吗?
    不知道大项目是怎么做的,求解!
      

  19.   

    问题的关键,在于参数的个数和类型都不确定。而且,又要把DBoperation完全封在一个bean中。楼主,你是这个意思吧?我也不清楚,不过,我想问题解决不了的时候,绕开它也是个好办法。帮你顶下。
      

  20.   

    PareparedStatement比Statement的速度快多少,求教?我测的时候好像差不多
      

  21.   

    参数语句sqlStr= "  select a1,a2 from a where a1=? and  a2=? or a3=? "
    参数数组 Object[] obj = new Object[] { "ljh", new Long(123),new Integer(3)};public static ResultSet getResultSet(Connection connection, String sqlStr,
                Object[] objArr) 
        {
            PreparedStatement ps = null;
            try {
                ps = connection.prepareStatement(sqlStr);
                for (int i = 1; i <= objArr.length; i++) {
                 Object obj=objArr[i - 1];
                    ps.setObject(i, objArr[i - 1]);
                }
               return ps.executeQuery();
            } catch (SQLException ex)
            {
             LjhLogger.debug("getResultSet(prepareStatement):SQL["+sqlStr+"]",ex);
                return null;
            } finally {
              ps=null;
            }
        }
      

  22.   

    oreilly的企业级最佳实践中推荐程序员使用PareparedStatement而尽量避免用Statement。至于速度快多少其实我也不太清楚,自己没有测试过。