比如我现在要执行: 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的区别。
稍微麻烦一点的是有条件的条件,如: select * from classmate where name = 'kevin'; 这种语句(kevin是作为条件输入的,如果用户没有输入,希望的结果是select * from classmate)。 如果用Statment,直接if一下就可以了。 如果用PreStatment,要么用两个语句,要么是用: select * from classmate where (? is null or name = ?); 如果这样的条件比较多的话,用PreStatment就coding稍显麻烦。一点浅见,或诸位有更好的想法?
可以防止sql登陆问题.
前都也可以用参数,一个String+参数+String.不就行了?
这个很有可能会出问题
你试过这个语句没有 ;
select * from 表名 where 列名1='' or 1=1
当你Statement查询用多个参数的时候 就会出这个问题
因为双引号中只能用单引号的原因
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的区别。
select * from classmate where name = 'kevin'; 这种语句(kevin是作为条件输入的,如果用户没有输入,希望的结果是select * from classmate)。
如果用Statment,直接if一下就可以了。 如果用PreStatment,要么用两个语句,要么是用:
select * from classmate where (? is null or name = ?);
如果这样的条件比较多的话,用PreStatment就coding稍显麻烦。一点浅见,或诸位有更好的想法?