欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java獲取新insert數(shù)據(jù)自增id的實現(xiàn)方法

 更新時間:2019年06月27日 15:05:59   作者:yaerfeng  
這篇文章主要介紹了java獲取新insert數(shù)據(jù)自增id的實現(xiàn)方法,在具體生成id的時候,我們的操作順序一般是:先在主表中插入記錄,然后獲得自動生成的id,以它為基礎(chǔ)插入從表的記錄,需要的朋友可以參考下

在MySQL中,使用auto_increment類型的id字段作為表的主鍵,并用它作為其他表的外鍵,形成“主從表結(jié)構(gòu)”,這是數(shù)據(jù)庫設(shè)計中常見的用法。但是在具體生成id的時候,我們的操作順序一般是:先在主表中插入記錄,然后獲得自動生成的id,以它為基礎(chǔ)插入從表的記錄。

這里面有個困難,就是插入主表記錄后,如何獲得它對應(yīng)的id。通常的做法,是通過“select max(id) from tablename”的做法,但是顯然這種做法需要考慮并發(fā)的情況,需要在事務(wù)中對主表加以“X鎖“,待獲得max(id)的值以后,再解鎖。這種做法需要的步驟比較多,有些麻煩,而且并發(fā)性也不好。有沒有更簡單的做法呢?

答案之一是通過select LAST_INSERT_ID()這個操作。乍一看,它和select max(id)很象,但實際上它是線程安全的。也就是說它是具體于數(shù)據(jù)庫連接的。下面通過實驗說明:

1、在連接1中向A表插入一條記錄,A表包含一個auto_increment類型的字段。

2、在連接2中向A表再插入一條記錄。

3、結(jié)果:在連接1中執(zhí)行select LAST_INSERT_ID()得到的結(jié)果和連接2中執(zhí)行select LAST_INSERT_ID()的結(jié)果是不同的;而在兩個連接中執(zhí)行select max(id)的結(jié)果是相同的。

其實在MSSQL中SCOPE_IDENTITY()和IDENT_CURRENT()的區(qū)別和這里是類似的。使用SCOPE_IDENTITY()可以獲得插入某個IDENTITY字段的當前會話的值,而使用IDENT_CURRENT()會獲得在某個IDENTITY字段上插入的最大值,而不區(qū)分不同的會話。

注:使用select last_insert_id()時要注意,當一次插入多條記錄時,只是獲得第一次插入的id值,務(wù)必注意!

當然,我們還可以使用另一種更加便捷的方法:在JDBC追加記錄后,使用API獲得新追加記錄的主鍵值。

這個實現(xiàn)使用了Statement的getGeneratedKeys方法,
當Statement追加了一條記錄后,可以直接調(diào)用getGeneratedKeys方法獲得新追加記錄的key。

測試程序如下:

import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.ResultSet; 
import java.sql.Statement; 
public class GetGenerateKey { 
public static void main(String[] args) throws Exception { 
create(); 
} 
public static void create()throws Exception { 
System.setProperty("jdbc.drivers", "com.mysql.jdbc.Driver"); 
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc", "root", ""); 
Statement st = conn.createStatement(); 
String sql = "insert into user (name, birthday, money) values ('beck', '1949-10-01', 60)"; 
st.executeUpdate(sql, Statement.RETURN_GENERATED_KEYS); 
ResultSet rs = st.getGeneratedKeys(); 
if (rs.next()) { 
int id = rs.getInt(1); 
System.out.println ("生成記錄的key為 :" + id); 
} 
st.close(); 
conn.close(); 
} 
} 

程序運行結(jié)果:

生成記錄的key為 :9

數(shù)據(jù)庫的記錄為:

1
+----+----------+------------+-------+
2
| id | name | birthday | money |
3
+----+----------+------------+-------+
4
| 9 | beck | 1949-10-01 | 60 |
5
+----+----------+------------+-------+

總結(jié):這個API方法提供的好處就是不用重新再執(zhí)行一次查詢獲得新記錄的key值。減少了工作量和服務(wù)器的負擔。

注意點,在執(zhí)行executeUpdate方法的時候,要指定返回生成key的選項。

===========================================================

2種方法的java 代碼

Java代碼1

// 用這種方法能得到插入自增的id 很好用 
PreparedStatement pstmt = conn.prepareStatement(sql.toString(),PreparedStatement.RETURN_GENERATED_KEYS); 
for (int i = 0; i < pars.length; i++) { 
pstmt.setObject(i+1, pars[i]); 
} 
pstmt.executeUpdate(); 
long autoIncKeyFromApi = -1; 
ResultSet rs = pstmt.getGeneratedKeys(); 
if (rs.next()) { 
autoIncKeyFromApi = rs.getInt(1); 
} 
return autoIncKeyFromApi; 

Java代碼2

qRunner.update(conn,sql.toString(),pars); 
Long zsysqID = (Long) qRunner.query(conn, "SELECT LAST_INSERT_ID()", new ScalarHandler(1)); 

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java集合TreeSet用法詳解

    Java集合TreeSet用法詳解

    本文詳細講解了Java集合TreeSet用法,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-12-12
  • Java正則表達式之分組和替換方式

    Java正則表達式之分組和替換方式

    這篇文章主要介紹了Java正則表達式之分組和替換方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • struts2.2.3+spring3.1.0+mybatis3.1.0框架整合集成簡單demo

    struts2.2.3+spring3.1.0+mybatis3.1.0框架整合集成簡單demo

    本篇文章主要介紹了struts2.2.3+spring3.1.0 + mybatis3.1.0框架整合,結(jié)合在一起實現(xiàn)用戶的增刪改查功能,有需要的可以了解一下。
    2016-11-11
  • Java SpringBoot整合JSP和MyBatis

    Java SpringBoot整合JSP和MyBatis

    這篇文章主要介紹了SpringBoot如何整合JSP和MyBatis以及SpringBoot的基本設(shè)置,感興趣的小伙伴可以參考閱讀
    2023-03-03
  • Mybatis 動態(tài)SQL的幾種實現(xiàn)方法

    Mybatis 動態(tài)SQL的幾種實現(xiàn)方法

    這篇文章主要介紹了Mybatis 動態(tài)SQL的幾種實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧
    2020-11-11
  • 解決MyBatis中為類配置別名,列名與屬性名不對應(yīng)的問題

    解決MyBatis中為類配置別名,列名與屬性名不對應(yīng)的問題

    這篇文章主要介紹了解決MyBatis中為類配置別名,列名與屬性名不對應(yīng)的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11
  • Java JVM程序指令碼實例解析

    Java JVM程序指令碼實例解析

    這篇文章主要介紹了Java JVM程序指令碼實例解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友可以參考下
    2020-01-01
  • 詳解Reactor如何優(yōu)雅Exception異常處理

    詳解Reactor如何優(yōu)雅Exception異常處理

    初識響應(yīng)式編程的時候,除了從命令式的思維方式轉(zhuǎn)變?yōu)楹瘮?shù)式的編程方式外,其中有一個很大的不適應(yīng)的地方就是在面對異常時該怎么處理。本文將通過Project?Reactor的文檔以及源碼來深入解讀,在reactor中是如何優(yōu)雅地實現(xiàn)這異常處理三板斧,希望對大家有所幫助
    2023-02-02
  • 基于java實現(xiàn)websocket代碼示例

    基于java實現(xiàn)websocket代碼示例

    這篇文章主要介紹了基于java實現(xiàn)websocket代碼示例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友可以參考下
    2020-12-12
  • Java和MySQL數(shù)據(jù)庫中關(guān)于小數(shù)的保存問題詳析

    Java和MySQL數(shù)據(jù)庫中關(guān)于小數(shù)的保存問題詳析

    在Java和MySQL中小數(shù)的精度可能會受到限制,如float類型的小數(shù)只能精確到6-7位,double類型也只能精確到15-16位,這篇文章主要給大家介紹了關(guān)于Java和MySQL數(shù)據(jù)庫中關(guān)于小數(shù)的保存問題,需要的朋友可以參考下
    2024-01-01

最新評論