我有一个使用 JDBC API 从 MySQL 数据库表中获取记录的方法。我一直在使用的命令是:"SELECT column_1, column_2, ... FROM table;"列名以 ArrayList 的形式提供给方法,使用 StringBuilder 根据列名和表名构造查询。当使用 createStatement() 执行构造查询时,它会抛出:"java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near from $tableName' at line 1"这是该方法的完整代码:public ObservableList<ObservableList<String>> getTableData(String tableName, List<String> selectedParams, int rowCount) { try { StringBuilder query = new StringBuilder("select "); for (int i = 0; i < selectedParams.size(); i++) { query.append(selectedParams.get(i)).append(", "); } query.append("\b\b from ").append(tableName).append(" limit ").append(rowCount); System.out.println("query:" + query); ObservableList<ObservableList<String>> rows; try (ResultSet rset = st.executeQuery(query.toString())) { ResultSetMetaData rsmd = rset.getMetaData(); rows = FXCollections.observableArrayList(); while (rset.next()) { ObservableList<String> row = FXCollections.observableArrayList(); int count = 1; while (count <= rsmd.getColumnCount()) { row.add(rset.getString(count)); count++; } rows.add(row); } } rows.forEach((row) -> { System.out.println(row); }); return rows; } catch (SQLException ex) { Logger.getLogger(DBHelper.class.getName()).log(Level.SEVERE, null, ex); } return null; }运行代码时,生成的查询表单打印语句如下所示:"query:select territory from offices"我已经直接针对 db 和另一个简单的 JDBC 程序测试了这个查询,它们都运行良好。除了在这个方法中。请帮忙。
2 回答
慕沐林林
TA贡献2016条经验 获得超9个赞
问题 ID 在
for (int i = 0; i < selectedParams.size(); i++) {
query.append(selectedParams.get(i)).append(", ");
}
上面的代码将在参数名称之后附加一个额外的“,”,您可以使用
query.append(String.join(", ", selectedParams))
青春有我
TA贡献1784条经验 获得超8个赞
问题是
query.append("\b\b from ")不会从 StringBuilder中删除尾随的逗号和空格。当您将其打印到控制台时,它可能看起来像,但该字符串实际上确实包含
select territory, ␈␈ from offices
而 MySQL 显然不喜欢这样。
相反,您实际上想从 StringBuilder 中删除逗号(并留出空格):
query.deleteCharAt(query.length() - 2).append("from ")添加回答
举报
0/150
提交
取消
