#java #postgresql #jdbc
#java #postgresql #jdbc
Вопрос:
Я пытаюсь вставить данные через jdbc в мою недавно созданную таблицу в postgresql, которая является
public class Workers {
private int id;
private String first_name;
private String last_name;
private String state;
private Integer base_salary;
public void Workers(int id, String first_name,String last_name,String state,Integer base_salary) {
this.id=id;
this.first_name=first_name;
this.last_name=last_name;
this.state=state;
this.base_salary=base_salary;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getFirst_name() {
return first_name;
}
public void setFirst_name(String first_name) {
this.first_name = first_name;
}
public String getLast_name() {
return last_name;
}
public void setLast_name(String last_name) {
this.last_name = last_name;
}
public String getState() {
return state;
}
public void setState(String state) {
state = state;
}
public Integer getBase_salary() {
return base_salary;
}
public void setBase_salary(Integer l) {
this.base_salary = l;
}
}
Код Postgres:
create table worker
(
first_name varchar(20) ,
last_name varchar(20) ,
state varchar(20) ,
base_salary integer
);
Java: JDBC:
String query ="INSERT into worker(first_name,last_name,state,base_salary) values (?,?,?,?);";
ResultSet keys = null;
try(
Connection conn = DB.getConnection();
PreparedStatement stmt = conn.prepareStatement(query,Statement.RETURN_GENERATED_KEYS);
) {
stmt.setString(1, worker.getFirst_name());
stmt.setString(2, worker.getLast_name());
stmt.setString(3, worker.getState());
stmt.setInt(4, worker.getBase_salary());
int affected= stmt.executeUpdate();
if(affected==1) {
keys=stmt.getGeneratedKeys();
keys.next();
int newKey = keys.getInt(1);
worker.setId(newKey);
} else {
System.out.println("No rows affected please try again");
return false;
}
} catch (SQLException e) {
System.err.println(e);
return false;
} finally {
if(keys !=null) keys.close();
}
return true;
}
Код основного класса:
Workers worker = new Workers();
EmployeesManipulation.displayAllRows();
worker.setFirst_name(InputHelper.getInput("User name: "));//First_name is String
worker.setLast_name(InputHelper.getInput("Last name: "));//last_name is String
worker.setState(InputHelper.getInput("State: "));// State is String
worker.setBase_salary(InputHelper.getIntegerInput("base Salary:"));//Base_salaryInteger
Объяснение вывода:
Мой ввод:
User name: Fares
Last name: Essayeh
State: New york
Base Salary: 12345
Вывод:
org.postgresql.util.PSQLException: неверное значение для типа int: тарифы
Обратите внимание: после обновления моей базы данных на Java выводится следующее:
full_name: Fares Essayehstate: nullbase_salary
Комментарии:
1. Похоже, что параметры вашего запроса где-то по пути перепутались. Вы пробовали отслеживать с помощью отладчика, чтобы увидеть, какие значения в конечном итоге передаются различными
setXXX()
методами?2. я добавляю класс, кажется, что-то не соответствует значениям типа данных
3. ДА. Может быть, кто-то более проницательный, чем я, сразу заметит проблему. Но если бы это был мой код, я бы отключил отладчик. Одна точка останова и пара одиночных шагов, и, скорее всего, у вас будет ответ.
4. Спасибо за усилия, я все равно выполню отладку
5. Я не уверен, но попробуйте отправить intValue baseSalary следующим образом: stmt.SetInt(4, worker.getBase_salary().intValue());
Ответ №1:
Таблица не имеет автоматически сгенерированного идентификатора. Сначала вы должны изменить его на
create table worker(
id serial primary key not null,
first_name varchar(20) ,
last_name varchar(20) ,
state varchar(20) ,
base_salary integer
);
id
Поле также может иметь GENERATED AS IDENTITY
, но я базы данных, которые у меня есть для тестирования перед предоставлением ответа, устарели и не поддерживают этот синтаксис.
Я бы посоветовал вам изменить запрос на следующий:
INSERT INTO worker(first_name,last_name,state,base_salary) VALUES (?,?,?,?) RETURNING id
Вам не нужна завершающая точка с запятой ;
при использовании API-интерфейсов подключения, подобных этому, из других языков.