2016-02-12 3 views
1

Это мой метод:PreparedStatement проблемы в Java

@Override 
public void deleteOneRecord(String tableName, String id) throws ClassNotFoundException, SQLException{ 
    // Validate the parameters here. 

    // String sql = "DELETE FROM " + tableName + " WHERE " + column + "=" + value; 
    String pKeyColumnName = ""; 
    // Statement stmt = conn.createStatement(); 

    DatabaseMetaData dmd = conn.getMetaData(); 

    ResultSet rs = dmd.getPrimaryKeys(null, null, tableName); 
    while(rs.next()){ 
     pKeyColumnName = rs.getString("COLUMN_NAME"); 
     System.out.println("PK column name is " + pKeyColumnName); 
    } 
    //String sql = "delete from " + tableName + " where " + pKeyColumnName + "=" + id; 

    String sql2 = "delete from ? where ?=?"; 

    PreparedStatement pstmt = conn.prepareStatement(sql2); 
    pstmt.setString(1, tableName); 
    pstmt.setString(2, pKeyColumnName); 
    pstmt.setInt(3, Integer.parseInt(id)); 

    pstmt.executeUpdate(); 
} 

Это мой тест main:

public static void main(String[] args) throws ClassNotFoundException, SQLException { 
    DBStrategy db = new MySqlDBStrategy(); 
    db.openConnection("com.mysql.jdbc.Driver", "jdbc:mysql://localhost:3306/book", "root", "admin"); 
    System.out.println(db.findAllRecords("author", 0).toString()); 
    db.deleteOneRecord("author", "2"); 
    System.out.println(db.findAllRecords("author", 0).toString()); 
    db.closeConnection(); 

} 

ДБ объект работы, открытое соединение работает, моя находка все метод записи работает, затем мой deleteOneRecord взрывается. Я получаю эту ошибку:

Exception in thread "main" com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: 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 ''author' where 'author_id'=2' at line 1

Теперь мой синтаксис не изменился, я был запущен этот код, как только Statement не проблема несколько минут назад, так что я должен использовать PreparedStatement неправильно как-то.

Любая помощь будет оценена в значительной степени.

+3

'?' Используется только для значений столбцов, не для имен столбцов или таблиц. – Satya

+0

Вы должны выполнить его '' удалить из «+ tableName +», где «+ pKeyColumnName +» =? »' – Satya

+0

Спасибо. Я собираюсь обновить это сейчас. дам вам знать. – Drewtang

ответ

3

Я не верю, что вы можете использовать параметры для имени таблицы или имени столбца. Вам придется объединить их в строку. В зависимости от того, откуда они взялись, будьте осторожны с уязвимостями SQL-инъекций!

+0

вот что я пытался избежать. Я полагаю, что могу запустить проверку имени одного входящего стола, чтобы убедиться, что он является законным. – Drewtang

+0

Вы можете использовать регулярное выражение для проверки того, что переменные, включая только юридические символы, для столбцов и имен таблиц. –

+1

@Drewtang Я предполагаю, что вы это делаете, вызов 'getPrimaryKeys() не найдет ничего, если будет предоставлено неправильное имя таблицы, так что пока вы проверяете это (чего у вас нет) d быть безопасным. – Andreas

Смежные вопросы