Инструкция Java create table sql

#java #mysql #sql

#java #mysql #sql

Вопрос:

я хочу создать новую таблицу MySQL с помощью этого метода. Подключение к базе данных работает отлично. Я сделал много рабочих инструкций, подобных этой, но эта, с созданием таблицы, не работает. Таким образом, ошибка должна быть в этих нескольких строках кода. В боттоне я добавил сообщение об ошибке.

  public void createNewTable(){
        DatabaseConnection connectNow = new DatabaseConnection();
        Connection connectDb = connectNow.getConnection();
        String tableName = "users";
        try {
               String createTable = "CREATE TABLE ? (firstname varchar(30), lastname varchar(30), tel integer"  
                "email varchar(40), arrive_stamp timestamp, quit_stamp timestamp)";
            PreparedStatement myStmt = connectDb.prepareStatement(createTable);
            myStmt.setString(1, tableName);
            myStmt.executeUpdate();
        } catch (Exception e) {
            e.printStackTrace();
            e.getCause();
        }

    }






 Illegal operation on empty result set.
    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 ''users' (firstname varchar(30), 
lastname varchar(30), tel integer, email varchar' at line 1
 

Ответ №1:

Имена объектов базы данных (включая имена таблиц) не могут быть привязаны к заполнителям. Вам придется жестко закодировать имя таблицы или использовать конкатенацию строк. Будет работать следующее:

 try {
    String sql = "CREATE TABLE users (firstname varchar(30), lastname varchar(30), tel integer, "  
                 "email varchar(40), arrive_stamp timestamp, quit_stamp timestamp)";
    PreparedStatement myStmt = connectDb.prepareStatement(sql);
    myStmt.executeUpdate();
}
catch (Exception e) {
    e.printStackTrace();
    e.getCause();
}
 

Комментарии:

1. Спасибо за ответ 🙂 Но, как это, я не защищен от SQL-инъекций, верно?

2. Нет, наоборот, оператор имеет нулевые входные данные извне, поэтому он на 100% защищен от SQL-инъекций. Необычно, когда имя таблицы вводится извне. Я не говорю, что таких вариантов использования нет, просто в вашем случае это, вероятно, указывает на проблему дизайна.

3. Вы правы. Но в долгосрочной перспективе я планирую заменить «user» на входное значение из другого метода. Вот почему я использовал подготовленный оператор. Есть ли какой-нибудь способ сделать это и при этом быть в безопасности от SQL-инъекции?

4. Если это действительно ваше требование, то вам придется стерлизовать входное имя самостоятельно. Это означает, что он не имеет пробелов, является одним «словом» и не является ключевым словом SQL, среди прочего. Это все еще сопряжено с риском.

5. Хорошо, большое вам спасибо за вашу помощь :). Еще один вопрос: ваш пример кода работает, но почему я получаю это сообщение об ошибке: «Незаконная операция с пустым результирующим набором».?

Ответ №2:

Вам не хватает , tel email столбца между и. И, как упоминал Тим в комментарии, вы должны использовать имя таблицы в самой инструкции sql.

Ваш оператор sql должен быть

 String createTable = "CREATE TABLE your_table_name (firstname varchar(30), lastname varchar(30), tel integer, "   -- added , at the end
                "email varchar(40), arrive_stamp timestamp, quit_stamp timestamp)";