在java中转义撇号

axkjgtzd  于 2021-06-30  发布在  Java
关注(0)|答案(7)|浏览(432)

我对java还是有点陌生,正在尝试将数据插入数据库。我在插入包含的字符串时出错,因此我的最终结果将是转义撇号。我怎样才能做到?

krcsximq

krcsximq1#

问题不在于java,而在于底层数据库。很可能您将参数串在一起,如下所示:

String sql = "select * from sometable where somefield = " + someObject.getSomeField();

别那么做。改用preparedstatement。
如果这是一个必须关注这些事情的应用程序,那么它还有防止sql注入攻击的额外优势。

kse8i1jr

kse8i1jr2#

使用stringescapeutils:

StringEscapeUtils.escapeSql(yourstring);

注意:从commons lang 3.0开始:
stringescapeutils.escapesql
这是一种误导性的方法,只处理最简单的sql案例。由于sql不是lang的重点,所以维护这个方法是没有意义的。

mxg2im7a

mxg2im7a3#

我假设您使用的是java.sql.statement,并使用字符串调用executequery方法。这很糟糕,因为可以进行sql注入。您应该改用java.sql.preparedstatement,然后可以将任何字符串设置为参数,这样就不会有问题了。
例如:

PreparedStatement pstmt = con.prepareStatement("UPDATE MY_TABLE SET TEXT_FIELD = ?");
pstmt.setString(1, "any String 'will work here!");
czfnxgou

czfnxgou4#

使用reflect util类自动引用转义撇号。很快我将分享整个图书馆。

/**
 * An automated Sql Escape Apostrophe before preparing an Object as Sql insert
 * query
 * 
 * @param obj
 * @return List of all field's values as string type
 */
public static Object escapeSql_Apostrophe(Object obj) {
    List<Field> fields = getDeclaredFields(obj);
    for (Field field : fields) {
        field.setAccessible(true); // Additional line
        String val = new String();
        // System.out.println("type : " + field.getType().getSimpleName());
        if (isPredfinedObject(field)) {
            try {
                val = field.get(obj) + "";
                if (val.contains("'")) {
                    val = val.replaceAll("'", "''");
                    String type = field.getType().getSimpleName();
                    if (type.equals(String.class.getSimpleName())) {
                        field.set(obj, val);
                    }
                    if (type.equals(Character.class.getSimpleName())) {
                        field.setChar(obj, val.charAt(0));
                    }
                }
            } catch (IllegalArgumentException | IllegalAccessException e) {
                e.printStackTrace();
            }
        } else {
            try {
                System.out.println(field.get(obj));
                System.out.println(getAllFieldsValues(field.get(obj)));
                continue;
            } catch (IllegalArgumentException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }
    }
    return obj;
}
dddzy1tm

dddzy1tm5#

这取决于您使用的数据库。通常情况下,''是有效的(我对sql server只有第一手的知识)。
你在用什么数据库?

j1dl9f46

j1dl9f466#

取决于数据库,但您可以在sqlserver中使用“”。
编辑:在mysql中,可以使用双撇号或反斜杠:http://www.faqts.com/knowledge_base/view.phtml/aid/630

p5fdfcr1

p5fdfcr17#

使用事先准备好的陈述。除了处理任何特殊字符外,它们更健壮,有助于防止sql注入攻击。

相关问题