如何使用 JDBC 检索由 PreparationStatement 生成的自动递增值?
jdbcobject oriented programmingprogramming
在创建表时,在某些情况下,我们需要自动生成/递增列的值,例如 ID。不同的数据库以不同的方式支持此功能。
在 MySQL 数据库中,您可以使用以下语法声明一个自动递增列。
CREATE TABLE table_name( ID INT PRIMARY KEY AUTO_INCREMENT, column_name1 data_type1, column_name2 data_type2, column_name3 data_type3, column_name4 data_type4, ............ ........... );
在表中插入记录时,无需在自动递增列下插入值。这些将自动生成。
例如,在一个表中,如果我们有一列名称为 ID、数据类型为 INT,该列会自动递增,并且如果该表中已经有 6 条记录。当您使用 INSERT 语句插入下一条记录时,新记录的 ID 值为 7,其下一条记录的 ID 值为 8。
(您可以为这些自动递增列指定初始值和间隔)。
检索自动递增值
如果您使用 PreparedStatement 对象将记录插入包含自动递增列的表中。
您可以使用 getGeneratedKeys() 方法检索由当前 PreparationStatement 对象生成的特定列的值。
示例
让我们在 MySQL 数据库中创建一个名为 sales 的表,并使用 CREATE 语句将其中一列设置为自动递增,如下所示 −
CREATE TABLE Sales( ID INT PRIMARY KEY AUTO_INCREMENT, ProductName VARCHAR (20), CustomerName VARCHAR (20), DispatchDate date, DeliveryTime time, Price INT, Location VARCHAR(20) );
现在,使用 PreparedStatement 对象向此表中插入记录,并检索其生成的自动递增值 −
- 使用 DriverManager 类的 registerDriver() 方法或名为 Class 的类的 forName() 方法注册所需数据库的 Driver 类。
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
- 通过将数据库 URL、数据库中用户的用户名和密码(字符串格式)作为参数传递给 DriverManager 类的 getConnection() 方法,创建一个 Connection 对象。
Connection mysqlCon = DriverManager.getConnection(mysqlUrl, "root", "password");
- 使用连接接口的 prepareStatement() 方法创建一个 PreparedStatement 对象。
向此方法传递 INSERT 语句,该语句包含字符串格式的绑定变量,其中一个参数为 Statement.RETURN_GENERATED_KEYS,另一个参数为 −
//查询以将值插入到销售表 String insertQuery = "INSERT INTO Sales (ProductName, CustomerName, DispatchDate, DeliveryTime, Price, Location) VALUES (?, ?, ?, ?, ?, ?)"; //创建 PreparationStatement 对象 PreparedStatement pstmt = con.prepareStatement(insertQuery, Statement.RETURN_GENERATED_KEYS);
- 使用 setXXX() 方法将每条记录的值设置为绑定变量,并将其添加到批次中。
pstmt.setString(1, "Key-Board"); pstmt.setString(2, "Raja"); pstmt.setDate(3, new Date(1567315800000L)); pstmt.setTime(4, new Time(1567315800000L)); pstmt.setInt(5, 7000); pstmt.setString(6, "Hyderabad"); pstmt.addBatch(); pstmt.setString(1, "Earphones"); pstmt.setString(2, "Roja"); pstmt.setDate(3, new Date(1556688600000L)); pstmt.setTime(4, new Time(1556688600000L)); pstmt.setInt(5, 2000); pstmt.setString(6, "Vishakhapatnam"); pstmt.addBatch(); ........... ...........
将所有记录的值添加到批处理后,使用executeBatch()方法执行批处理。
pstmt.executeBatch();
- 最后,使用getGeneratedKeys()方法获取此PreparedStatement对象生成的自增键。
ResultSet rs = pstmt.getGeneratedKeys(); while (rs.next()) { System.out.println(rs.getString(1)); }
以下JDBC程序使用PreparedStatement向Sales表(上面创建的)插入5条记录,并检索并显示其生成的自增值。
示例
import java.sql.Connection; import java.sql.Date; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.sql.Time; public class RetrievingData_AutoIncrement_Pstmt { public static void main(String args[]) throws SQLException { //注册驱动程序 DriverManager.registerDriver(new com.mysql.jdbc.Driver()); //获取连接 String mysqlUrl = "jdbc:mysql://localhost/sample_database"; Connection con = DriverManager.getConnection(mysqlUrl, "root", "password"); System.out.println("连接已建立......"); //查询以将值插入到 sales 表中 String insertQuery = "INSERT INTO Sales (ProductName, CustomerName, DispatchDate, DeliveryTime, Price, Location) VALUES (?, ?, ?, ?, ?, ?)"; //创建PreparedStatement对象 PreparedStatement pstmt = con.prepareStatement(insertQuery,Statement.RETURN_GENERATED_KEYS); pstmt.setString(1, "Key-Board"); pstmt.setString(2, "Raja"); pstmt.setDate(3, new Date(1567315800000L)); pstmt.setTime(4, new Time(1567315800000L)); pstmt.setInt(5, 7000); pstmt.setString(6, "Hyderabad"); pstmt.addBatch(); pstmt.setString(1, "Earphones"); pstmt.setString(2, "Roja"); pstmt.setDate(3, new Date(1556688600000L)); pstmt.setTime(4, new Time(1556688600000L)); pstmt.setInt(5, 2000); pstmt.setString(6, "Vishakhapatnam"); pstmt.addBatch(); pstmt.setString(1, "Mouse"); pstmt.setString(2, "Puja"); pstmt.setDate(3, new Date(1551418199000L)); pstmt.setTime(4, new Time(1551418199000L)); pstmt.setInt(5, 3000); pstmt.setString(6, "Vijayawada"); pstmt.addBatch(); pstmt.setString(1, "Mobile"); pstmt.setString(2, "Vanaja"); pstmt.setDate(3, new Date(1551415252000L)); pstmt.setTime(4, new Time(1551415252000L)); pstmt.setInt(5, 9000); pstmt.setString(6, "Chennai"); pstmt.addBatch(); pstmt.setString(1, "Headset"); pstmt.setString(2, "Jalaja"); pstmt.setDate(3, new Date(1554529139000L)); pstmt.setTime(4, new Time(1554529139000L)); pstmt.setInt(5, 6000); pstmt.setString(6, "Goa"); pstmt.addBatch(); System.out.println("Records inserted......"); //执行批处理 pstmt.executeBatch(); //当前PreparedStatement对象生成的自动递增值 ResultSet res = pstmt.getGeneratedKeys(); System.out.println("Auto-incremented values of the column ID generated by the current PreparedStatement object: "); while (res.next()) { System.out.println(res.getString(1)); } } }
输出
连接已建立...... Records inserted...... Auto-incremented values of the column ID generated by the current PreparedStatement object: 1 2 3 4 5