public class DataBase {

    public static void main(String[] args) {
        try (Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/company", , )) {
            Type[] types = { new GraphicCard(), new HardDrive(), new Keyboard(), new Memory(), new Monitor(), new Mouse(), new Processor() };
            Product product = new Product(10, types);
            Range rangeUnitPrice = new Range(10_000, 220_000);
            Range rangeQuantity = new Range(0, 20);
            Statement statement = connection.createStatement();
            while (product.getNumberOfEntery() > 0) {
                String typeAndCatagory = product.getRandomType();
                String name = product.getName(typeAndCatagory);
                String description = product.getDescription();
                double unit_Price = product.randomUnit_PriceGenerator(name, 'x', rangeUnitPrice);
                int quantity_In_Stock = product.generateQuantity_In_Stock(rangeQuantity);
                String brand = product.getRandomBrand();
                System.out.println("Имя: " + name + ", " + "Type: " + typeAndCatagory + ", " + "Случайная цена: " + unit_Price + ", " + "Количество на складе: " + quantity_In_Stock + ", " + "Случайный бренд: " + brand);
                String query = "INSERT INTO product VALUES (" + name + ", " + description + ", " + unit_Price + ", " + quantity_In_Stock + ", " + brand + ", " + typeAndCatagory + ", " + typeAndCatagory + ")";
                statement.executeUpdate(query);
                product.decreasesNumberOfEntrees();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }

    }
}

Запрос не работает, и первое значение является значением по умолчанию (PRIMARY KEY AUTO-INCREMENT), которое мне не нужно указывать. Ошибка приведена ниже

java.sql.SQLSyntaxErrorException: У вас ошибка в синтаксисе SQL; проверьте в руководстве, соответствующем вашей версии сервера MySQL, правильный синтаксис для использования около '10 AMD graphic card Gamer Edition, , 180657.63138583858, 6, HP, Graphic Card, Gr' на строке 1

Moh reza Kh

Ответов: 2

Ответы (2)

В этой строке вы форматируете строку для использования в качестве оператора SQL:

String query = "INSERT INTO product VALUES (" + name + ", " + description + ", " + unit_Price + ", " + quantity_In_Stock + ", " + brand + ", " + typeAndCatagory + ", " + typeAndCatagory + ")";

Что-то не так с этим утверждением, из-за чего оно выдает синтаксическую ошибку. Что именно не так?

Трудно отлаживать это, глядя на выражение Java. Непонятно смотреть на все ` и `+, чтобы понять, что не так.

Было бы проще понять, что не так, если бы вы видели конечный результат строки, а не выражение Java, которое строит строку.

Поэтому перед выполнением попробуйте распечатать его:

System.out.println(query);

Тогда проблема может быть более четко видна.

Я предсказываю, что она будет выглядеть примерно так:

INSERT INTO product VALUES (10 AMD graphic card Gamer Edition, , 180657.63138583858, 6, HP, Graphic Card, Gr...

This is missing quotes around the string values in your VALUES clause. It's not valid SQL. Лучшее решение - научиться использовать параметры запроса. Тогда вам не придется беспокоиться о кавычках вокруг значений. И код будет более защищен от SQL-инъекций. В вашем случае можно использовать что-то вроде следующего:

String query = "INSERT INTO product VALUES (?, ?, ?, ?, ?, ?, ?)";
Statement statement = connection.prepareStatement(query);
while (product.getNumberOfEntery() > 0) {

    // set the values for all your variables...

    statement.setString(1, name);
    statement.setString(2, description);
    statement.setDouble(3, unit_Price);
    statement.setInt(4, quantity_In_Stock);
    statement.setString(5, brand);
    statement.setString(6, typeAndCatagory);
    statement.setString(7, typeAndCatagory);
    statement.executeUpdate();
}

В вашем коде есть две проблемы:

  1. Основное - ваш код уязвим для SQL Injection.
  2. Вам придется самостоятельно заключать текстовые значения в одинарные кавычки.

Решением обеих проблем является использование PreparedStatement, как показано ниже:

String query = "INSERT INTO product VALUES (?, ?, ?, ?, ?)";

try (PreparedStatement pstmt = con.prepareStatement(query)) {
    //...

    pstmt.setString(1, name);
    pstmt.setString(2, description);
    pstmt.setDouble(3, unit_Price);
    //...

    pstmt.executeUpdate();
}

Кроме того, я советую вам всегда следовать Java naming conventions Например, unit_Price должно быть названо как unitPrice.

2022 WebDevInsider