<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    yxhxj2006

    常用鏈接

    統計

    最新評論

    Java執行sql語句并獲取指定返回值

    當我們插入一條數據的時候,我們很多時候都想立刻獲取當前插入的主鍵值返回以做它用。我們通常的做法有如下幾種: 

     1、先 select max(id) +1 ,然后將+1后的值作為主鍵插入數據庫; 

      2、使用特定數據庫的 auto_increment 特性,在插入數據完成后,使用 select max(id) 獲取主鍵值; 

      3、對于Oracle,使用 sequence 獲取值。 

      對于以上3種方法都無法絕對保證在高并發情況下的操作的原子性。 

      現記錄以下幾種獲取數據庫主鍵值方法: 

      1、數據庫原生支持的sql方法: 

      SQLServer: 

    INSERT INTO table_name (.....) VALUES(......) SELECT @@IDENTITY AS aliasname; 


      上面的語句相當于查詢語句,從結果集中使用 getXXX(aliasname) 方法獲取主鍵值。 

      Oracle: 

    INSERT INTO table_name(......) VALUES(......) RETURNING[primaryKey INTO]:aliasname; 


      也是相當于查詢語句,從結果集中使用 getXXX(aliasname) 方法獲取主鍵值。 

      2、java.sql.Statement 返回鍵獲取: 

      a: 使用JDBC 3.0提供的 getGeneratedKeys(推薦使用) 

    Statement stmt = ... ; 

    stmt.executeUpdate("INSERT INTO table_name(......) VALUES(......)", Statement.RETURN_GENERATED_KEYS); 

    ResultSet rs = stmt.getGeneratedKeys(); 

    int keyValue = -1; 

    if (rs.next()) { 

    keyValue = rs.getInt(1); 


      b:使用特定數據庫特有的SQL 

    Statement stmt = ... ; 

    stmt.executeUpdate("INSERT INTO table_name(......) VALUES(......)", Statement.RETURN_GENERATED_KEYS); 

    ResultSet rs = stmt.executeQuery("SELECT LAST_INSERT_ID()"); 

    int keyValue = -1; 

    if (rs.next()) { 

    keyValue = rs.getInt(1); 


      那么現在我就一個例子來看一下原生的sql怎么能得到執行的返回結果 

      項目背景:數據庫是oracle數據庫,id生成規則是通過觸發器插入數據的時候自動增長,所以在插入數據的時候在sql中就不需要指明id值。但是另外一張表需要引用這個id值作為外鍵,那么就必須獲得被引用的這個表的ID,為了避免并發問題,我們只能在插入前面那張表的時候就獲得他的ID,所以我使用了下面的方法來處理。 

    Connection con = DBConnector.getconecttion(); // 取得一個數據庫連接 
    CallableStatement cst = null; 
    con.setAutoCommit(false); 
    String insertSql = "begin insert into TABLE (field_0,field_1) values (value_0,value_1) returning id into ?;end; "; 
    try { 
    cst = con.prepareCall(insertSql); //執行存儲過程 
    cst.registerOutParameter(1, Types.INTEGER); //為存儲過程設定返回值 
    int count = cst.executeUpdate(); //得到預編譯語句更新記錄或刪除操作的結果 
    int id = cst.getInt(1); //得到返回值 
    System.out.println("成功執行了:" + count + "條數據,其ID值:" + id); 
    } catch (SQLException e1) { 
    con.rollback(); 
    con.setAutoCommit(true); 
    }finally{ 
    con.commit(); 
    con.close(); 
     

    posted on 2012-09-20 00:50 奮斗成就男人 閱讀(1289) 評論(0)  編輯  收藏


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 青青青国产在线观看免费 | 日韩亚洲人成在线综合日本| 国产精品亚洲а∨天堂2021 | 国产一级黄片儿免费看| 亚洲国产精品一区二区第四页| 国产精品亚洲综合久久| 免费毛片网站在线观看| 亚洲成av人无码亚洲成av人| 暖暖免费高清日本一区二区三区| 亚洲色精品VR一区区三区| 青草草色A免费观看在线| ASS亚洲熟妇毛茸茸PICS| 免费看无码自慰一区二区| 亚洲a∨无码精品色午夜| 自怕偷自怕亚洲精品| 精品一区二区三区无码免费视频| 777亚洲精品乱码久久久久久| 最近免费中文字幕大全免费| 亚洲第一页在线视频| 久久国产福利免费| 亚洲动漫精品无码av天堂| 57pao一国产成永久免费| 亚洲人成电影院在线观看| 免费爱爱的视频太爽了| 一个人看的在线免费视频| 久久精品九九亚洲精品天堂| 久久久精品2019免费观看 | 久久免费观看国产精品| 亚洲精品中文字幕乱码影院| 无码中文在线二区免费| 日韩免费在线中文字幕| 亚洲VA中文字幕不卡无码| 日本人的色道免费网站| 含羞草国产亚洲精品岁国产精品| 中文字幕不卡亚洲| 青草草色A免费观看在线| 日本一区二区三区在线视频观看免费| 亚洲国产成人片在线观看| 国产在线国偷精品产拍免费| 未满十八私人高清免费影院| 亚洲人成在线影院|