<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 奮斗成就男人 閱讀(1288) 評論(0)  編輯  收藏


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


    網站導航:
     
    主站蜘蛛池模板: 免费无码AV电影在线观看| 午夜无码A级毛片免费视频| 日韩电影免费在线观看视频| 亚洲精品视频观看| 91福利视频免费观看| 亚洲无人区视频大全| 无码人妻久久一区二区三区免费丨| 亚洲免费视频播放| 免费看大黄高清网站视频在线| 亚洲大码熟女在线观看| 又大又黄又粗又爽的免费视频| 一级毛片a免费播放王色电影 | 成人免费视频69| 色在线亚洲视频www| 精品国产免费一区二区| 特级aa**毛片免费观看| 亚洲日本一区二区三区在线| 久久中文字幕免费视频| 国外成人免费高清激情视频| 成年丰满熟妇午夜免费视频| 亚洲人成无码www久久久| 一级毛片免费一级直接观看| 久久噜噜噜久久亚洲va久| 国产精品怡红院永久免费| 精品女同一区二区三区免费播放 | 亚洲精品成人片在线观看| 最新久久免费视频| 亚洲免费视频观看| 国产a不卡片精品免费观看| 99精品视频免费| 2020国产精品亚洲综合网| 亚洲成a人片在线观看老师| 国产成人免费AV在线播放| 亚洲欧洲中文日产| 高清在线亚洲精品国产二区| 日本免费在线中文字幕| 亚洲av无码成人影院一区| 亚洲日韩精品射精日| 四虎成人免费网站在线| 国产在线一区二区综合免费视频 | 亚洲一区在线观看视频|