betacode

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

  1. Проблема
  2. Получить значение столбца ID только что вставленной записи
  3. Получить значения разных вставленных столбцов

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);

	}
}

Java Basic

Show More