我有以下代码来执行sql查询:
query = String.format("select * from users where user_name = '%s';", results.getString(1));
results2 = mStmt.executeQuery(query);
数据集中的一个user_name的值为“O'brien”。由于“O'brien”中的单个括号,这会破坏我的查询。查询将变为:
select * from users where user_name = 'O'brien'
要克服此问题而不修改数据的策略是什么?
编辑:准备好的语句确实解决了单引号问题,但这只是问题的一部分。我有一个字符串值包含单词“UNDER”。这是一个SQL关键字。例如,我有一个带有查询的名为insertAll的preparedStatement:
insert into names (id, val1, val2, val3, val4, tTime, val5) values (?, ?, ?, ?, ?, ?, ?)
感谢您的帮助!
答案 0 :(得分:5)
使用prepareStatement设置参数。您的代码是本书中可以利用SQL注入的代码。 http://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html
答案 1 :(得分:1)
为什么不使用PreparedStatement,避免在sql查询中完全转义引号的繁琐且容易出错的问题?
可能看起来像这样(对不起,我实际上没有运行这个,但你应该明白这个):
query = "select * from users where user_name = ?";
PreparedStatement p = new PreparedStatement(con, query);
p.setString(1, results.getString(1));
results2 = p.executeQuery();