后者是预编译的SQL语句。两者在功能上好像是一样的。前者的功能。后者能完成。后都也如同。

解决方案 »

  1.   

    PreStatments可以批量执行.可以参数的形式para1=? and para2=?...
    可以防止sql登陆问题.
      

  2.   

    也就是说两者的实现其实是一样的?
    前都也可以用参数,一个String+参数+String.不就行了?
      

  3.   

    前都也可以用参数,一个String+参数+String.不就行了?
       这个很有可能会出问题
      你试过这个语句没有 ;
       select * from 表名 where 列名1='' or 1=1
         当你Statement查询用多个参数的时候  就会出这个问题
        因为双引号中只能用单引号的原因
      

  4.   

    PreStatments可以重复使用,效率上好一些吧!
      

  5.   

     select * from 表名 where 列名1='' or 1=1虽然麻烦,但前者也能实现后者的功能,对吧。
      

  6.   

    PreparedStatement 是先给数据库预编译,再填充参数的,而后执行 SQL 的,可以有效地防止 SQL 注入,另外由于是预编译好的,所以就可以重复填充参数,可以提高效率。而 Statement 不是这样的,是先组成 SQL 语句,一起扔给数据库编译再执行的。还有一个区别在于代码的整洁方面,想想 Statement 中使用字符串来拼接 SQL,将会导致代码变得十分的混乱,不易进行调试,当字段很多时,这个缺点尤为突出。而 PreparedStatement 使用“?”占位符,在代码方面就很干净,易于调试、查错。Statement 的功能 PreparedStatement 都能完成,反过来就不行了。所以,建议使用 PreparedStatement。
      

  7.   

    比如我现在要执行: select t.* from table_t t where t.sid = 1;
      select t.* from table_t t where t.sid = 1;
    ....
    如果用Statments, 要sidParam赋值1,2用sql = "select t.* from table_t t where t.sid =" + sidParam; 然后把sql传给数据库编译执行(2次编译2次执行,如果有10000个就是10000次);如果用PreStatments,只要用sql = "select t.* from table_t t where t.sid = ?";然后在执行前用prepareStatement.setLong(parameterIndex, sidParam);设置一下参数就可以了(1次编译2次运行,如果有10000个还是1次编译10000次执行)PS:这里编译是在connection.prepareStatement(sql)时完成的。也就是说,这两者的区别是,N + N 与 1 + N的区别。
      

  8.   

    稍微麻烦一点的是有条件的条件,如:
    select * from classmate where name = 'kevin'; 这种语句(kevin是作为条件输入的,如果用户没有输入,希望的结果是select * from classmate)。
    如果用Statment,直接if一下就可以了。 如果用PreStatment,要么用两个语句,要么是用:
    select * from classmate where (? is null or name = ?);
    如果这样的条件比较多的话,用PreStatment就coding稍显麻烦。一点浅见,或诸位有更好的想法?