Java MySQL проверяет, существует ли значение в базе данных

Я пытаюсь проверить, если определенное значение уже существует в моей базе данных. Я обращаюсь к базе данных из автономного приложения Java с помощью JDBC (запросы на вставку записей в db файл, так что моя настройка и подключение в порядке).

String queryCheck = "SELECT * from messages WHERE msgid = " + msgid;
Statement st = conn.createStatement();
ResultSet rs = st.executeQuery(queryCheck); // execute the query, and get a java resultset

// if this ID already exists, we quit
if(rs.absolute(1)) {
     conn.close();
     return;
}

Я получаю эту ошибку (очевидно, что-то не так с моим синтаксисом SQL):

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'd-f05708071f8f' at line 1

Однако, если я попытаюсь выполнить эту команду в командной строке MySQL, она работает! Можете ли вы сказать мне, что случилось с моим выражением? Спасибо за любые советы!

Ответ 1

Вам нужно обернуть String в кавычки в MySQL, поэтому запрос должен быть

SELECT * from messages WHERE msgid = 'd-f05708071f8f';

Не

SELECT * from messages WHERE msgid = d-f05708071f8f;

Поэтому код должен читать

String queryCheck = "SELECT * from messages WHERE msgid = '" + msgid + "'";

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

final String queryCheck = "SELECT * from messages WHERE msgid = ?";
final PreparedStatement ps = conn.prepareStatement(queryCheck);
ps.setString(1, msgid);
final ResultSet resultSet = ps.executeQuery();

Использование конкатенации строк для построения запроса считается очень плохой практикой. Уже давно.

Далее я бы предложил использовать select count(*), а не полный select *, поскольку это возвращает гораздо меньше данных (подумайте о размере ResultSet), и MySQL также может оптимизировать его.

final String queryCheck = "SELECT count(*) from messages WHERE msgid = ?";
final PreparedStatement ps = conn.prepareStatement(queryCheck);
ps.setString(1, msgid);
final ResultSet resultSet = ps.executeQuery();
if(resultSet.next()) {
    final int count = resultSet.getInt(1);
}

Ответ 2

Вам нужно использовать переменные связывания.

 PreparedStatement st = conn.prepareStatement(
    "SELECT * from messages WHERE msgid = ?");
 st.setString(1, msgid);
 ResultSet rs = st.executeQuery(queryCheck); 

Или перейдите в ручное цитирование, но это опасно.

В дополнение к предотвращению SQL-инъекции подготовленные операторы также должны повысить производительность при повторном повторении одного и того же запроса.

Ответ 3

Так как msgid является varchar, вам нужно окружить значение в предложении where одинарными кавычками.

String queryCheck = "SELECT * from messages WHERE msgid = '" + msgid + "'";

Динамическое создание строк SQL не рекомендуется, так как оно может подвергнуть ваше приложение SQL-инъекции.

Вместо этого используйте PreparedStatement:

            String queryCheck = "SELECT * from messages WHERE msgid = ?";
            PreparedStatement st = conn.prepareStatement(queryCheck);
            st.setString(1, msgid);
            ResultSet rs = st.executeQuery();

Ответ 4

Используйте одинарные кавычки, запустите параметр:

"SELECT * FROM messages WHERE msgid = '" + msgid + "'";

Или лучше использовать подготовленные заявления.

Ответ 5

Вы можете попробовать следующее:

String queryCheck = "SELECT * from messages WHERE msgid = '" + msgid + "'";

Утеряны котировки. (Я предполагаю, что msgid - String, а не Integer значение.)

Ответ 6

Вам нужно использовать одинарные кавычки

SELECT * from messages WHERE msgid = 'd-f05708071f8f'; 

Ответ 7

String sql1 ="SELECT Time FROM monday_wednesday WHERE Time ='"+time.getSelectedItem()+"'";
pst=con.prepareStatement(sql1);
rs=pst.executeQuery();
if(rs.next()) {
    if(rs.getString("Time").equals(time.getSelectedItem())) {
        JOptionPane.showMessageDialog(null,"Time is already taken","",JOptionPane.INFORMATION_MESSAGE); 
    }
} else {
    String sql="INSERT INTO monday_wednesday(pfname,pmname,plname,Birthdate,Gender,Address,City,Contact,Contactperson,Time,Date)\n" + "VALUES ('"+txtFirstName1.getText()+"','"+txtMiddleName1.getText()+"','"+txtLastName1.getText()+"','"+d+"','"+gender.getSelectedItem()+"','"+ txtAddress.getText()+"','"+txtCity.getText()+"','"+txtContact.getText()+"','"+txtContactPerson1.getText()+"','"+time.getSelectedItem()+"','"+dateFormat.format(date)+"')";
}

Просто простой алгоритм записи дубликатов