Очень первый вопрос, поэтому я приношу свои извинения за любые ошибки и недостатки.
В основном есть три файла, мой основной метод 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.
Спасибо всем заранее.
У вас много проблем с вашим кодом :-) Во-первых, вы не можете устанавливать имена таблиц или столбцов с помощью "setString" в подготовленном заявлении! См. Этот вопрос: как использовать переменную tablename для вставки готовой инструкции Java. Во-вторых, как отметил Даниэль Перейра: вы пытаетесь использовать "подобное" выражение с "setInt"! См. Https://dev.mysql.com/doc/refman/8.0/en/pattern-matching.html.
Попробуйте сделать что-то вроде этого:
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'
который является синтаксической ошибкой.
Вы сравниваете с LIKE
но вы устанавливаете Int
. Измените LIKE
на =
и посмотрите, работает ли он.
select * from "Table" where "Column" like "%a%"
Это явно недопустимый SQL Синтаксис.