Не удается создать базу данных jdbc

Я пытаюсь создать базу данных с java jdbc с помощью метода, поэтому я передаю тип имени string базы данных в качестве аргумента базы данных, но я столкнулся с проблемой, которая является У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, чтобы найти правильный синтаксис для использования рядом с «Алгеброй» в строке 1

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class DbTest {
private Connection connection;
public void createDb(String name) throws SQLException {
    connection = DriverManager.getConnection
            ("jdbc:mysql://localhost/?user=root&password=root");

    String createDbSql = "CREATE DATABASE IF NOT EXISTS ?";
    PreparedStatement createDbStat = connection.prepareStatement(createDbSql);
    createDbStat.setString(1,name);
    createDbStat.executeUpdate();
}

DbTest() {
    try {
        createDb("Algebra");
    } catch (SQLException e) {
        e.printStackTrace();
    }
}

public static void main(String[] args) {
    new DbTest();
}
}
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
338
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Когда вы используете createDbStat.setString(1, name);, он создает такой запрос:

CREATE DATABASE IF NOT EXISTS 'databasename'
//----------------------------^____________^

И это неправильный синтаксис, правильный должен быть:

CREATE DATABASE IF NOT EXISTS databasename

для решения вашей проблемы вы можете просто использовать:

String createDbSql = String.format("CREATE DATABASE IF NOT EXISTS `%s`", name);
//                                                                ^^^^
PreparedStatement createDbStat = connection.prepareStatement(createDbSql);
//createDbStat.setString(1,name); no need for this
createDbStat.executeUpdate();

По соображениям безопасности

Просто по соображениям безопасности и во избежание SQL-инъекции убедитесь, что имя вашей базы данных соответствует этому:

if (name.matches("^[a-zA-Z_][a-zA-Z0-9_]*$")){
   //Correct name
}

для более подробной информации прочтите этот Проверьте правильность имени столбца SQL

Вы не можете привязать свой параметр (1) к имени базы данных - в этом случае вам придется использовать конкатенацию строк.

Ваш вопрос тоже похож на

Как использовать переменную tablename для вставки подготовленного оператора java

а также

Запрос CREATE DATABASE с использованием java jdbc и подготовленного оператора возвращает синтаксическую ошибку

Другие вопросы по теме