Получить значения столбцов, автоматически возрастающих при вставлении (Insert) записи, используя JDBC
View more Tutorials:


В некоторых базах данных, столбец ID таблицы может быть видом, у которого значения автоматически увеличиваются. Каждый раз при вставлении записи (record) в таблицу, значение данного столбца будет прикреплено базой данных, вы не можете сами определить ему значение. Ваш вопрос в том, как получить ID только что вставленной записи.
Кроме того, существуют некоторые столбцы, которые не участвуют в вашей команде Insert, в таком случае его значение прикреплено по умолчанию базой данных, вы хотите получить эти значения без необходимости создавать еще одну команду запроса.
PostGres
В PostGres, столбец с видом Serial будет иметь значение автоматически увелчивающееся базой данных.
** Employees (PostGres) **
CREATE TABLE Employees
(
ID serial NOT NULL,
Full_Name character varying(50) NOT NULL,
Gender character varying(1) default 'M' NOT NULL,
Hire_Date date NOT NULL,
PRIMARY KEY (ID)
);

MySQL
В MySQL, чтобы столбец имел значение с автоматическим увеличением, ему должно быть прикреплено атрибут (attribute) "Auto_Increase".
** Employees (MySQL) **
CREATE TABLE Employees
(
ID Int Auto_Increase NOT NULL,
Full_Name Varchar(50) NOT NULL,
Gender Varchar(1) default 'M' NOT NULL,
Hire_Date date NOT NULL,
PRIMARY KEY (ID)
);

Когда вы используеете JDBC для Insert (вставления) записи в базу данных. Столбец ID может не участвовать в команде Insert. Местоположение столбца ID определяется дизайном такой таблицы. Первый столбец имеет индекс 1, второй столбец имеет индекс 2,...

GeneratedIDValueExample.java
package org.o7planning.tutorial.jdbc.others;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import org.o7planning.tutorial.jdbc.ConnectionUtils;
public class GeneratedIDValueExample {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
// Получить подключение к базе данных.
Connection conn = ConnectionUtils.getMyConnection();
// Employees (id, full_name, gender, hire_date)
// ID: Auto Increase
String sql = "Insert into Employees " //
+ " (full_name, gender, hire_date) " //
+ " values " //
+ " (?, ?, ?)";
// Создать объект PreparedStatement.
PreparedStatement pstm = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
pstm.setString(1, "Tran");
pstm.setString(2, "M");
pstm.setDate(3, new java.sql.Date(System.currentTimeMillis()));
// Execute!
pstm.execute();
ResultSet rs = pstm.getGeneratedKeys();
int idValue = 0;
if (rs.next()) {
// Значение ID
idValue = rs.getInt(1);
}
System.out.println("ID value: " + idValue);
}
}
Индекс столбца ID таблицы может быть не 1 (В зависимости от дизайна таблицы). В данном случае лучше всего вам нужно получить доступ к значение по имени.
GeneratedIDValueExample2.java
package org.o7planning.tutorial.jdbc.others;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import org.o7planning.tutorial.jdbc.ConnectionUtils;
public class GeneratedIDValueExample2 {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
Connection conn = ConnectionUtils.getMyConnection();
// Employees (id, full_name, gender, hire_date)
// ID: Auto Increase
String sql = "Insert into Employees " //
+ " (full_name, gender, hire_date) " //
+ " values " //
+ " (?, ?, ?)";
// Create a PreparedStatement object.
PreparedStatement pstm = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
pstm.setString(1, "Tran");
pstm.setString(2, "M");
pstm.setDate(3, new java.sql.Date(System.currentTimeMillis()));
// Execute!
pstm.execute();
ResultSet rs = pstm.getGeneratedKeys();
int idValue = 0;
if (rs.next()) {
// Value of ID.
// Note, for some DB, column names are case sensitive.
// (eg Postgres, column names are always lowercase).
idValue = rs.getInt("id");
}
System.out.println("ID value: " + idValue);
}
}
Неокторые столбцы не могут участвовать в вашей команде Insert. Их значение прикрепляются с помощью базы данных, вы можете получить их значения без необходимости создавать еще одну команду запроса.

GetGeneratedValueExample2.java
package org.o7planning.tutorial.jdbc.others;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.o7planning.tutorial.jdbc.ConnectionUtils;
public class GetGeneratedValueExample2 {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
Connection conn = ConnectionUtils.getMyConnection();
// Employees (id, full_name, gender, hire_date)
// ID: Auto Increase
// gender: Default
String sql = "Insert into Employees " //
+ " (Full_Name, Hire_Date) " //
+ " values " //
+ " (?, ?)";
// Создать объект PreparedStatement.
// И зарегистрировать выходные параметры по названиям ("id", "gender", "hire_date")
PreparedStatement pstm = conn.prepareStatement(sql, new String[] { "id", "gender", "hire_date" });
pstm.setString(1, "Tran");
pstm.setDate(2, new java.sql.Date(System.currentTimeMillis()));
// Execute!
pstm.execute();
ResultSet rs = pstm.getGeneratedKeys();
int idValue = 0;
String gender = null;
java.sql.Date hireDate = null;
if (rs.next()) {
idValue = rs.getInt("ID");
gender = rs.getString("Gender");
hireDate = rs.getDate("Hire_Date");
}
System.out.println("ID value: " + idValue + " Gender: " + gender + ", Hidedate: " + hireDate);
}
}