Java 从commons.lang迁移StringEscapeUtils.escapeSql

Java 从commons.lang迁移StringEscapeUtils.escapeSql,java,apache-commons-lang,Java,Apache Commons Lang,我已经开始将commons.lang 2迁移到commons.lang3 据 StringEscapeUtils.escapeSql 这是一种误导性的方法,只处理最简单的SQL案例。>由于SQL不是Lang的重点,所以维护这种方法是没有意义的 了解它,但建议使用什么来代替它 澄清 您能推荐一个执行类似于StringEscapeUtils.escapeSql的简单escapeSql的第三方吗?: 目前,这种方法只能将单引号转换为双引号(“麦克海尔海军”=>“麦克海尔海军”) 这是方法代码:

我已经开始将commons.lang 2迁移到commons.lang3

StringEscapeUtils.escapeSql

这是一种误导性的方法,只处理最简单的SQL案例。>由于SQL不是Lang的重点,所以维护这种方法是没有意义的

了解它,但建议使用什么来代替它

澄清

您能推荐一个执行类似于StringEscapeUtils.escapeSql的简单escapeSql的第三方吗?

目前,这种方法只能将单引号转换为双引号(“麦克海尔海军”=>“麦克海尔海军”)

这是方法代码:

  /**
675         * <p>Escapes the characters in a <code>String</code> to be suitable to pass to
676         * an SQL query.</p>
677         *
678         * <p>For example,
679         * <pre>statement.executeQuery("SELECT * FROM MOVIES WHERE TITLE='" + 
680         *   StringEscapeUtils.escapeSql("McHale's Navy") + 
681         *   "'");</pre>
682         * </p>
683         *
684         * <p>At present, this method only turns single-quotes into doubled single-quotes
685         * (<code>"McHale's Navy"</code> => <code>"McHale''s Navy"</code>). It does not
686         * handle the cases of percent (%) or underscore (_) for use in LIKE clauses.</p>
687         *
688         * see http://www.jguru.com/faq/view.jsp?EID=8881
689         * @param str  the string to escape, may be null
690         * @return a new String, escaped for SQL, <code>null</code> if null string input
691         */
692        public static String escapeSql(String str) {
693            if (str == null) {
694                return null;
695            }
696            return StringUtils.replace(str, "'", "''");
697        }
682*

683 * 684*目前,这种方法只能将单引号转换为双引号 685*(
“麦克海尔海军”
=>
“麦克海尔海军”
)。事实并非如此 686*处理在LIKE子句中使用的百分比(%)或下划线(%)

687 * 688*见http://www.jguru.com/faq/view.jsp?EID=8881 689*@param str要转义的字符串可能为空 690*@如果输入空字符串,则返回一个新字符串,为SQL转义,
null
691 */ 692公共静态字符串转义SQL(字符串str){ 693如果(str==null){ 694返回空值; 695 } 696返回字符串。替换(str,“,”); 697 } 因此,您可以简单地调用
String#replace
来替换该方法


但是,删除该方法是有原因的。这真是半生不熟,我想不出一个好的理由,为什么你会想用它。例如,要运行JDBC查询,您可以而且应该使用绑定变量,而不是尝试插入和转义字符串文字。

如果您使用的是JDBC连接,请准备一个包含以下参数的语句:

您不需要转义使用准备语句上的函数插入的任何元素。这些是自动转义的

这一点在之前的中已得到回答:

有一个由OWASP调用的API,它提供了其中一些函数,您可以查看。

描述一下您的用例。最简单的方法是“运行数据库查询”,通常不需要转义任何SQL(可以而且应该使用绑定变量),为什么要这样做?这似乎是个坏主意,所以我能理解为什么删除了这个方法。简单的用例。。。如果在“order by”子句中恰好有所需的参数,PreparedStatement将不起作用。实际上,确实存在一个用例:转义SQL语句中不能通过bind变量参数化的部分。例如,表名iteself:@MarcusJuniusBrutus:我不会指望在那里使用相同的转义规则。如果您在架构对象名称中使用空格或引号之类的东西,您已经在自找麻烦了。@Thilo这个用例如何:如果您碰巧在“order by”子句中有所需的参数,PreparedStatement不起作用。@NathanCrause不确定您的意思。如果您想让变量列名按abc DESC的顺序排列,那么是的,就像Marcus对表名的评论一样,绑定参数不能用于模式对象名,只能用于值。下面是一个示例和网站内的链接,解释了如何使用此API以及对其他方法的讨论。ESAPI.encoder().encodeForSQL(新的OracleCodec(),queryparam);但它并不适用于所有SQL子句。正如我在这里提到的,如果您的“orderby”中出现参数,它就不起作用。
con.prepareStatement("INSERT INTO table1 VALUES (?,?)");
pstmt.setInt(1, 200);
pstmt.setString(2, "Julie");
pstmt.executeUpdate();