我还是Java的新手,并尝试将数据插入数据库。我插入一个包含's的字符串时出错,所以我的最终结果是逃避撇号。我怎么能完成?
答案 0 :(得分:13)
使用准备好的陈述。除了处理任何特殊字符外,它们还更加强大,有助于防止SQL注入攻击。
答案 1 :(得分:6)
问题实际上不是Java,而是底层数据库。你最有可能将参数串起来像这样:
String sql = "select * from sometable where somefield = " + someObject.getSomeField();
不要那样做。请改用PreparedStatement。
如果这是一个必须关注此类事情的应用程序,那么它具有防止SQL注入攻击的额外优势。
答案 2 :(得分:5)
StringEscapeUtils.escapeSql(yourstring);
警告:从Commons Lang 3.0开始:
<强> StringEscapeUtils.escapeSql 强>
这是一种误导性的方法,只处理最简单的SQL案例。由于SQL不是Lang的重点,因此维护此方法没有意义。
答案 3 :(得分:2)
取决于数据库,但您可以在SqlServer中使用''。
编辑:在MySql中你可以使用双撇号或反斜杠:http://www.faqts.com/knowledge_base/view.phtml/aid/630
答案 4 :(得分:1)
我假设您正在使用java.sql.Statement,并使用String调用executeQuery方法。这很糟糕,因为它可以进行SQL注入。您应该使用java.sql.PreparedStatement代替,然后您可以将任何您想要的字符串设置为参数,并且您不会遇到问题。
例如:
PreparedStatement pstmt = con.prepareStatement("UPDATE MY_TABLE SET TEXT_FIELD = ?");
pstmt.setString(1, "any String 'will work here!");
答案 5 :(得分:1)
使用我的Reflect util类自动引用Escape Apostrophe。很快我将分享整个图书馆。
/**
* 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;
}
答案 6 :(得分:0)
这取决于您使用的数据库。通常''工作(我只有SQL Server的第一手资料)。
您使用的数据库是什么?