Заполнители не работают при использовании оператора SQL в Java (JDBC)

Самый первый вопрос здесь, поэтому я приношу свои извинения за любые ошибки и недостатки.

В основном это три файла: мой основной метод tech_supportv1, login_controller, содержащий класс, используемый для хранения множества методов, и login.java, javabean. Дело в том, чтобы проверить, существует ли определенная строка в базе данных tech_support. Для этого я пытаюсь использовать приведенный ниже код. (db_util и type - это классы, содержащие данные подключения, они протестированы и работают).

ПРОБЛЕМА: кажется, что данные из основного метода не вставлены в строку в соответствующих заполнителях, и возвращается ошибка. (Конечно, если я вручную введу строки вместо использования заполнителей, все будет работать нормально.)

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: у вас есть ошибка в синтаксисе SQL; проверьте руководство, которое соответствует вашей версии сервера MariaDB, чтобы найти правильный синтаксис для использования рядом с '' техников 'ГДЕ' techID 'LIKE 16' в строке 1

Я устал смотреть документы mariaDB, но весь другой синтаксис дает те же результаты.

Итак, это основной метод.

public class Tech_support_v1 {

public static void main(String[] args) {

    System.out.println("Start.");

    login bean = new login();

    bean.setTable("technicians");
    bean.setColumn("techID");
    bean.setID(16);

    login_controller.select(bean);

}

}

Это метод выбора (с bean в качестве аргумента, логин - это класс Javabean).

public static boolean select(login bean) {

    String sql = "SELECT * FROM ? WHERE ? LIKE ?";

    ResultSet rs;

    try (
            Connection conn = db_util.getConn(db_type.MYSQL);
            PreparedStatement stmt = conn.prepareStatement(sql);
            ) {

        stmt.setString(1, bean.getTable());
        stmt.setString(2, bean.getColumn());
        stmt.setInt(3, bean.getID());

        rs = stmt.executeQuery();

        if (rs.next()) {
            System.out.println("Y");
            return true;
        } else {
            System.err.println("N");
            return false;
        }

    } catch (Exception e) {
        System.err.println(e);
        return false;
    }

}

Я не буду включать класс компонента, потому что это буквально всего три переменные с относительными методами set / get. Также база данных работает с MariaDB и является MySQL.

Заранее всем спасибо.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
1 527
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы сравниваете LIKE, но устанавливаете Int. Измените LIKE на = и посмотрите, работает ли он.

К сожалению, это не так.

Matteo Baldini 17.05.2018 09:02
Ответ принят как подходящий

У вас несколько проблем с кодом :-) Во-первых, вы не можете задавать имена таблиц или столбцов с помощью "setString" в подготовленном операторе! См. Этот вопрос: Как использовать переменную tablename для вставки подготовленного оператора java Во-вторых, как заметил Даниэль Перейра: вы пытаетесь использовать выражение «like» с помощью «setInt»! См .: https://dev.mysql.com/doc/refman/8.0/en/pattern-matching.html

Спасибо, я проверю их.

Matteo Baldini 17.05.2018 09:09

В качестве примечания: если вы используете "setString", вы всегда будете получать строки в кавычках ... так что ваш SQL будет выглядеть так: select * from "Table" where "Column" like "%a%" Это явно недопустимый синтаксис SQL.

Chris Eibl 17.05.2018 09:15

Хорошо, я заработал! большое спасибо. Без особых изменений.

Matteo Baldini 17.05.2018 09:36

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

String sql = "SELECT * FROM :table ";


try (
            Connection conn = db_util.getConn(db_type.MYSQL);
            PreparedStatement stmt = conn.prepareStatement(sql);
            )
{
   String query = StringUtils.replace(sql, ":table", bean.getTable());
   stmt.executeQuery(query);
}

Вы создаете эквивалент SELECT * FROM 'tablename', что является синтаксической ошибкой.

Mark Rotteveel 17.05.2018 11:28

отредактировал мое предложение. Спасибо.

phoenix 17.05.2018 11:33

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