在csdn上以前有过贴子:http://search.csdn.net/expert/topic/54/5401/2003/6/30/1973545.htm
感觉没有真正理解和解决问题。
比如我要进行一个简单的查询
select field1 from tableA where fieldB like 'x%'
其中x由用户输入。如果用preparedStatement,会写成
PreparedStatement pstmt 
    = con.prepareStatement("select field1 from tableA where fieldB like ?");然后用pstmt.setString(1,"user_inputed_data");
但是这里不仅仅是直接setString就行了,因为需要使用通配符(wildcard),也就是用%。如果直接写sql语句,可以自己拼凑,字符串头尾加上%就行了,但是对于preparedStatement的参数却可能不行,因为preparedStatement在设置参数的时候,自动进行了SQL转义(escaping),比如如果设置的参数里面包含一个'(单引号),我们不需要进行额外的转义,直接用preparedStatement.setString就行了。因为根据java specification以及API文档中的说明,preparedStatement是会自动负责转义的,而Statement里面可以用{keyword...escape}的形式来人工转义。根据文档说明,preparedStatement在创建的时候就分析了语法,setEscapeProcessing是没有用的。(Note: Since prepared statements have usually been parsed prior to making this call, disabling escape processing for PreparedStatements objects will have no effect. )也就是说,即使我们平凑出一个使用%结尾的参数,传递给PreparedStatement,也可能不能起到通配符的作用。
实际上的结果是由JDBC Driver控制的,似乎有些JDBC Driver在对PreparedStatement设置参数的时候没有进行转义,而有些转义了。当然可以通过自己拼凑SQL的方法来回避这个问题,但是某些情况下(比如我正在写的代码)要自己拼凑SQL过于繁琐困难。想知道有没有什么办法,可以继续使用PreparedStatement并且确保对其Set参数的时候可以自己控制转义(代码不能依赖于任何JDBC Driver)。