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)+"')";
}
Просто простой алгоритм записи дубликатов