Правильный способ добавления данных в таблицу в PostgreSQL с использованием JDBC?

#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 /…