#java #sql #postgresql #jdbc
#java #sql #postgresql #jdbc
Вопрос:
Это мой первый пост здесь, если мое форматирование неправильное / трудночитаемое, я его изменю. Пожалуйста, дайте мне знать.
Я играл с JDBC, пытаясь добавить базовые данные в базу данных, используя введенные пользователем данные. Пользователь вводит имя и фамилию, адрес электронной почты, а идентификатор пользователя генерируется с помощью функции random .
База данных была создана с использованием PostgreSQL. Я пытаюсь добавить в таблицу с именем accounts, которая содержит следующие столбцы — user_id (целое число), first_name (varchar(100)), last_name (varchar(100)), email (varchar (500)).
Моя программа может успешно подключиться к базе данных, но она не может добавлять данные в таблицу.
в следующем коде FirstName, LastName и eMail — это все строки, а sID — это int .
state = conx.prepareStatement("INSERT INTO accounts VALUES (" sID "," firstName "," lastName "," eMail) ")");
s.executeUpdate();
Обычно я надеюсь, что данные будут добавлены в таблицу, чтобы мы могли на этом закончить, но я получаю сообщение об ошибке.
org.postgresql.util.PSQLException: ERROR: column "v" does not exist
Position: 36
at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2440)
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2183)
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:308)
at org.postgresql.jdbc.PgStatement.executeInternal(PgStatement.java:441)
at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:365)
at org.postgresql.jdbc.PgPreparedStatement.executeWithFlags(PgPreparedStatement.java:143)
at org.postgresql.jdbc.PgPreparedStatement.executeUpdate(PgPreparedStatement.java:120)
at Main.main(Main.java:49)
org.postgresql.util.PSQLException: ERROR: column "v" does not exist
Position: 36
Комментарии:
1. Ваша
PreparedStatement
переменнаяstate
. Почему вы звонитеs.executeUpdate()
? Что такоеs
?2. Не объединяйте значения в строке SQL. Используйте
?
параметры в PreparedStatement. В противном случае ваш код будет уязвим для внедрения SQL.3. @WDS Использование bind parms также повышает производительность, и вам не нужно беспокоиться о том, чтобы заключать строки в кавычки, что, кстати, вы забыли сделать в приведенном выше примере.
Ответ №1:
Используйте ?
для параметров вместо объединения их значений. Кроме того, вы должны назвать столбцы в INSERT
инструкции. Например:
s = conx.prepareStatement(
"INSERT INTO accounts (id, first_name, last_name, email) "
"VALUES (?, ?, ?, ?)"
);
s.setInt(1, sID);
s.setString(2, firstName);
s.setString(3, lastName);
s.setString(4, email);
int affectedRows = s.executeUpdate();
Комментарии:
1. Это сделало свое дело! Это определенно делает код намного более читаемым! Есть ли какая-либо причина, по которой оператор execute update сохраняется как int ?
2. После выполнения инструкции SQL база данных сообщает вам, сколько строк было затронуто (как int). В этом случае это будет всегда
1
, но в случаеUPDATE
DELETE
операторов or это значение может быть полезным. См docs.oracle.com/javase/7/docs/api/java/sql /…