如何将我写的没有硬编码值,这个sql语句?
resultSet = statement
.executeQuery("select * from myDatabase.myTable where name = 'john'");
// this works
而有类似:
String name = "john";
resultSet = statement
.executeQuery("select * from myDatabase.myTable where name =" + name);
// Unknown column 'john' in 'where clause' at
// sun.reflect.NativeConstructorAccessorImpl.newInstance0...etc...
提前致谢..
它通常是一个可怕的想法来构造SQL查询你目前做的方式,因为它开启了大门,各种SQL注入攻击 。 为了正确地做到这一点,你将不得不使用预处理语句来代替。 这也将解决种种逃避,你显然此刻遇到这样的问题。
PreparedStatement statement = connection.prepareStatement("select * from myDatabase.myTable where name = ?");
statement.setString(1, name);
ResultSet resultSet = statement.executeQuery();
需要注意的是prepareStatement()
是一个昂贵的呼叫(除非你的应用程序服务器使用语句缓存和其他类似设备)。 从理论上讲,如果你准备语句一次,然后重复使用它多次(尽管不是同时)这将会是最好的:
String[] names = new String[] {"Isaac", "Hello"};
PreparedStatement statement = connection.prepareStatement("select * from myDatabase.myTable where name = ?");
for (String name: names) {
statement.setString(1, name);
ResultSet resultSet = statement.executeQuery();
...
...
statement.clearParameters();
}
你缺少周围的字符串单引号,你的代码更正:
String name = "john";
String sql = "select * from myDatabase.myTable where name = '" + name + "'";
// Examine the text of the query in the debugger, log it or print it out using System.out.println
resultSet = statement.executeQuery(sql);
打印出/执行查询,看看它看起来OK之前登录查询的文本。
如果你打算做了很多类似的查询,其中只有不断的变化,可以考虑使用预处理语句
这应该工作:
String name = "john";
resultSet = statement
.executeQuery("select * from myDatabase.myTable where name =" + "'" + name + "'");
你需要把周围的值(“约翰”,而不是约翰)报价...
尝试以下方法:
String name = "john";
resultSet = statement
.executeQuery("select * from myDatabase.myTable where myTable.name = '" + name + "'");
把引号你的name
值,因为它是一个字符串。
"select * from myDatabase.myTable where name ='" + name + "'"