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

0

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

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

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

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии сервера MariaDB, для правильного синтаксиса для использования рядом с "техническими специалистами" WHERE '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);

}

}

Это метод select (с bean как аргумент, login - класс 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;
    }

}

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

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

Теги:
mariadb
jdbc

3 ответа

0
Лучший ответ

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

  • 0
    Спасибо, я проверю это.
  • 0
    Как примечание: если вы используете "setString", вы всегда будете получать строки в кавычках ... так что ваш SQL будет выглядеть так: select * from "Table" where "Column" like "%a%" Это явно недопустимый SQL Синтаксис.
Показать ещё 1 комментарий
0

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

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);
}
  • 0
    Вы создаете эквивалент SELECT * FROM 'tablename' который является синтаксической ошибкой.
  • 0
    отредактировал мое предложение. Благодарю.
0

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню