jdbc-odbc桥中Statments和PreStatments有什么区别?
后者是预编译的SQL语句。两者在功能上好像是一样的。前者的功能。后者能完成。后都也如同。
------解决方案--------------------PreStatments可以批量执行.可以参数的形式para1=? and para2=?...
可以防止sql登陆问题.
------解决方案--------------------前都也可以用参数,一个String+参数+String.不就行了?
这个很有可能会出问题
你试过这个语句没有 ;
select * from 表名 where 列名1= ' ' or 1=1
当你Statement查询用多个参数的时候 就会出这个问题
因为双引号中只能用单引号的原因
------解决方案--------------------PreStatments可以重复使用,效率上好一些吧!
------解决方案--------------------PreparedStatement 是先给数据库预编译,再填充参数的,而后执行 SQL 的,可以有效地防止 SQL 注入,另外由于是预编译好的,所以就可以重复填充参数,可以提高效率。
而 Statement 不是这样的,是先组成 SQL 语句,一起扔给数据库编译再执行的。
还有一个区别在于代码的整洁方面,想想 Statement 中使用字符串来拼接 SQL,将会导致代码变得十分的混乱,不易进行调试,当字段很多时,这个缺点尤为突出。而 PreparedStatement 使用“?”占位符,在代码方面就很干净,易于调试、查错。
Statement 的功能 PreparedStatement 都能完成,反过来就不行了。
所以,建议使用 PreparedStatement。
------解决方案--------------------比如我现在要执行: 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的区别。