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

View more Tutorials:

1- Проблема

В некоторых базах данных, столбец  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)
);

2- Получить значение столбца 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);

	}
}

3- Получить значения разных вставленных столбцов

Неокторые столбцы не могут участвовать в вашей команде  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);

	}
}

View more Tutorials: