2017-07-25 127 views
0

我写了一个简单的方法来得到一个字符串从数据库中查询错误(com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException):预处理语句执行

public String getUserString(int id, String table, String column) { 
    String output = null; 
    try { 
     String sql = "SELECT ? FROM ? WHERE id=?;"; 
     PreparedStatement preparedStatement = getConnection().prepareStatement(sql); 
     preparedStatement.setString(1, column); 
     preparedStatement.setString(2, table); 
     preparedStatement.setInt(3, id); 
     ResultSet resultSet = preparedStatement.executeQuery(); 
     while (resultSet.next()) { 
      output = resultSet.getString(column); 
     } 
    } catch (SQLException e) { 
     e.printStackTrace(); 
    } 
    return output; 
} 

但是当我尝试使用它像这样:coreMySQL.getUserString(1, "economy", "balance");

我得到这个错误: https://pastebin.com/BMAmN4Xh

+0

是你的表名平衡?你能提供你的数据库表的快照 –

+0

我的表名不平衡,这是经济。这是数据库的屏幕截图:https://image.prntscr.com/image/WYs3J5XkT3_oSvK2EI5jfg.png –

+0

remove';'所以“SELECT?FROM?WHERE id =?” – resource8218

回答

0

您不能设置表名和列名与setXxx方法(个),PreparedStatement。它只能用于设置值。

但是,你可以做一个简单的String更换替代的表名和列名,例如:

String query = SELECT <column> FROM <table> WHERE id=?; 
String sql = query.replaceAll("<column>", column).replaceAll("<table>", table); 
PreparedStatement preparedStatement = getConnection().prepareStatement(sql); 
preparedStatement.setInt(1, id); 
ResultSet resultSet = preparedStatement.executeQuery(); 
while (resultSet.next()) { 
    output = resultSet.getString(column); 
} 
+0

谢谢你的回答。 –

+0

@blablamuhaha如果它能帮助你,你可以接受答案。 –

+0

这是我第一次在stackoverflow上,我该怎么做? –

0

定义查询模板:

String queryTemplate = "SELECT %s FROM %s where id = ?;"; 

// Inside Function: 

PreparedStatement preparedStatement = getConnection().prepareStatement(String.format(template, column, table)); 
preparedStatement.setInt(1, id); 
ResultSet resultSet = preparedStatement.executeQuery();