通過(guò)Java實(shí)現(xiàn)獲取表的自增主鍵值
獲取自增主鍵
在 Java 程序中,使用 JDBC 插入記錄到 MySQL 數(shù)據(jù)庫(kù)時(shí),可以通過(guò)以下步驟獲取自增主鍵的值:
第一步:在 PreparedStatement 對(duì)象中添加 Statement.RETURN_GENERATED_KEYS 常量作為參數(shù),表示希望獲取自動(dòng)生成的主鍵
代碼如下所示:
PreparedStatement stmt = connection.prepareStatement("INSERT INTO user VALUES (?,?,?)", Statement.RETURN_GENERATED_KEYS);
stmt.setInt(1, 2);
stmt.setString(2, "李四");
stmt.setString(3, "11000");
stmt.executeUpdate();第二步: 調(diào)用 PreparedStatement 對(duì)象的 getGeneratedKeys() 方法獲取 ResultSet,getGeneratedKeys() 是 JDBC 中的一個(gè)方法,它用于獲取執(zhí)行 SQL 語(yǔ)句后所生成的鍵,例如主鍵值、自增長(zhǎng)鍵等。
該方法返回一個(gè) ResultSet 對(duì)象,其中包含了所生成的鍵的信息,源碼如下所示:

需要注意的是,在某些情況下,執(zhí)行 SQL 操作并不一定能夠返回生成的鍵,這可能是因?yàn)閿?shù)據(jù)庫(kù)不支持生成鍵,或者 SQL 語(yǔ)句中沒(méi)有生成鍵的選項(xiàng)。
代碼如下所示:
ResultSet rs = stmt.getGeneratedKeys();
第三步:從 ResultSet 中獲取自動(dòng)生成的主鍵值
(rs.next()) {
int id = rs.getInt(1);
System.out.println("Inserted with ID: " + id);
}注意,ResultSet 中的第一個(gè)列就是自動(dòng)生成的主鍵列,使用 getInt(1) 或 getLong(1) 方法獲取該列的值。
完整代碼示例:
package Test;
import java.sql.*;
public class myjdbc {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
//注冊(cè)驅(qū)動(dòng)
Class.forName("com.mysql.cj.jdbc.Driver");
//獲取連接
String url="jdbc:mysql://localhost:3306/創(chuàng)建的數(shù)據(jù)庫(kù)名";
String username="root";
String password="你的數(shù)據(jù)庫(kù)密碼";
Connection connection= DriverManager.getConnection(url,username,password);
//添加常量參數(shù)
PreparedStatement stmt = connection.prepareStatement("INSERT INTO 你的數(shù)據(jù)表名 VALUES (?,?,?)", Statement.RETURN_GENERATED_KEYS);
stmt.setInt(1, 2);
stmt.setString(2, "李四");
stmt.setString(3, "11000");
stmt.executeUpdate();
//獲取ResultSet
ResultSet rs = stmt.getGeneratedKeys();
//獲得常量值
if (rs.next()) {
int id = rs.getInt(1);
System.out.println("Inserted with ID: " + id);
}
}
}獲取自增主鍵值的前提條件是:在數(shù)據(jù)表中必須存在自增主鍵。如果不存在自增主鍵,那么將無(wú)法獲取自增主鍵的值。
最后補(bǔ)充一下什么是生成鍵?
生成鍵
數(shù)據(jù)庫(kù)中的生成鍵(Generated Key)是指在插入一條新記錄時(shí),由數(shù)據(jù)庫(kù)自動(dòng)生成的主鍵值或唯一標(biāo)識(shí)符。
它通常與自增長(zhǎng)列(Auto Increment Column)或序列(Sequence)相關(guān)聯(lián),用于確保插入的新記錄具有唯一的標(biāo)識(shí)符。
常見(jiàn)的生成鍵類型包括:
1. 自增長(zhǎng)鍵(Auto Increment Key):在每次插入數(shù)據(jù)時(shí),自動(dòng)遞增的唯一整數(shù)值。在 MySQL 中使用 `AUTO_INCREMENT` 關(guān)鍵字實(shí)現(xiàn)自增長(zhǎng)鍵。
2. 序列(Sequence):由一個(gè)計(jì)數(shù)器提供唯一整數(shù)值的對(duì)象。在 Oracle、PostgreSQL 和 SQL Server 等數(shù)據(jù)庫(kù)中支持序列。
3. UUID 鍵(Universally Unique Identifier Key):全球唯一標(biāo)識(shí)符,使用隨機(jī)數(shù)生成。在 MySQL 中使用 `UUID()` 函數(shù)實(shí)現(xiàn) UUID 鍵。
在使用 JDBC 操作數(shù)據(jù)庫(kù)時(shí),可以通過(guò) ResultSet 的方法 getGeneratedKeys() 獲取生成鍵的值。
如果新的記錄具有自動(dòng)生成鍵,或者原始記錄的所有生成鍵已返回,則此方法返回一個(gè) ResultSet 對(duì)象,其中包含代表生成鍵的值的一列,通常情況下,這個(gè)值是一個(gè)整數(shù),可以通過(guò) getInt(1) 或者 getLong(1) 方法獲取主鍵值。
判斷數(shù)據(jù)庫(kù)是否支持生成鍵的方法
在 JDBC 中,我們可以通過(guò) DatabaseMetaData 獲取數(shù)據(jù)庫(kù)的元數(shù)據(jù)信息,進(jìn)而判斷該數(shù)據(jù)庫(kù)是否支持生成鍵。
具體實(shí)現(xiàn)步驟如下:
第一步:
//獲取當(dāng)前數(shù)據(jù)庫(kù)連接的 DatabaseMetaData 對(duì)象。 DatabaseMetaData metaData = connection.getMetaData();
可以通過(guò) getDatabaseProductName() 方法獲取數(shù)據(jù)庫(kù)的名稱,再結(jié)合不同的數(shù)據(jù)庫(kù)驅(qū)動(dòng)的實(shí)現(xiàn)方式,來(lái)判斷該數(shù)據(jù)庫(kù)是否支持生成鍵。
例如,在 MySQL 數(shù)據(jù)庫(kù)中,可以使用 supportsGetGeneratedKeys() 方法來(lái)判斷是否支持生成鍵。如果該方法的返回值為 true,則說(shuō)明該數(shù)據(jù)庫(kù)支持生成鍵。
完整代碼如下:
package Test;
import java.sql.*;
public class myjdbc {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
//注冊(cè)驅(qū)動(dòng)
Class.forName("com.mysql.cj.jdbc.Driver");
//獲取連接
String url="jdbc:mysql://localhost:3306/wjr";
String username="root";
String password="112899";
Connection connection= DriverManager.getConnection(url,username,password);
DatabaseMetaData metaData = connection.getMetaData();
boolean supportsGeneratedKeys = metaData.supportsGetGeneratedKeys();
if (supportsGeneratedKeys) {
System.out.println("該數(shù)據(jù)庫(kù)支持生成鍵");
} else {
System.out.println("該數(shù)據(jù)庫(kù)不支持生成鍵");
}
}
}到此這篇關(guān)于通過(guò)Java實(shí)現(xiàn)獲取表的自增主鍵值的文章就介紹到這了,更多相關(guān)Java表的自增主鍵值內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
面試必問(wèn)項(xiàng)之Set實(shí)現(xiàn)類:TreeSet
這篇文章主要介紹了Java TreeSet類的簡(jiǎn)單理解和使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2021-07-07
spring-session簡(jiǎn)介及實(shí)現(xiàn)原理源碼分析
這篇文章主要介紹了spring-session簡(jiǎn)介及實(shí)現(xiàn)原理源碼分析,具有一定參考價(jià)值,需要的朋友可以了解下。2017-11-11
SpringBoot?@Configuration與@Bean注解使用介紹
這篇文章主要介紹了SpringBoot中的@Configuration與@Bean注解,在進(jìn)行項(xiàng)目編寫前,我們還需要知道一個(gè)東西,就是SpringBoot對(duì)我們的SpringMVC還做了哪些配置,包括如何擴(kuò)展,如何定制,只有把這些都搞清楚了,我們?cè)谥笫褂貌艜?huì)更加得心應(yīng)手2022-10-10
Java接口返回省市區(qū)樹形結(jié)構(gòu)的實(shí)現(xiàn)
本文主要介紹了Java接口返回省市區(qū)樹形結(jié)構(gòu)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01
利用JAVA反射,讀取數(shù)據(jù)庫(kù)表名,自動(dòng)生成對(duì)應(yīng)實(shí)體類的操作
這篇文章主要介紹了利用JAVA反射,讀取數(shù)據(jù)庫(kù)表名,自動(dòng)生成對(duì)應(yīng)實(shí)體類的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-08-08
JDK8時(shí)間相關(guān)類超詳細(xì)總結(jié)(含多個(gè)實(shí)例)
jdk1.8的一些新特性簡(jiǎn)化了代碼的寫法,減少了部分開發(fā)量,下面這篇文章主要給大家介紹了關(guān)于JDK8時(shí)間相關(guān)類超詳細(xì)總結(jié),文中包含了多個(gè)實(shí)例代碼,需要的朋友可以參考下2023-01-01
解決SpringMVC項(xiàng)目連接RabbitMQ出錯(cuò)的問(wèn)題
這篇文章主要介紹了解決SpringMVC項(xiàng)目連接RabbitMQ出錯(cuò)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-01-01
論java如何通過(guò)反射獲得方法真實(shí)參數(shù)名及擴(kuò)展研究
這篇文章主要為大家介紹了java如何通過(guò)反射獲得方法的真實(shí)參數(shù)名以及擴(kuò)展研究,有需要的朋友可以借鑒參考下,希望能夠有所幫助祝大家多多進(jìn)步早日升職加薪2022-01-01

