<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)  編輯  收藏


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


    網站導航:
     
    主站蜘蛛池模板: 九九免费观看全部免费视频| 亚洲一区二区无码偷拍| GOGOGO免费观看国语| yy6080久久亚洲精品| 91短视频在线免费观看| 无码乱人伦一区二区亚洲一| 日韩精品人妻系列无码专区免费| 亚洲国产第一页www| 久热中文字幕在线精品免费| 亚洲av成人一区二区三区| 三年片在线观看免费观看高清电影| 亚洲中文无码a∨在线观看| 岛国大片免费在线观看| 老司机午夜在线视频免费观| 亚洲欧洲一区二区三区| 日韩精品在线免费观看| 亚洲国产成人在线视频| 国产精品自在自线免费观看| 黄色视屏在线免费播放| 亚洲精品亚洲人成在线观看麻豆| 成人无码区免费A片视频WWW| 亚洲AV电影院在线观看| 最近中文字幕mv免费高清在线| 亚洲综合久久精品无码色欲| 亚洲国产主播精品极品网红| 天黑黑影院在线观看视频高清免费| 久久国产精品亚洲综合| 成人激情免费视频| 亚洲国产人成在线观看| 免费被黄网站在观看| 香蕉视频在线免费看| 亚洲日韩国产精品乱-久| 亚洲第一区精品观看| 91福利免费体验区观看区| 国产精品成人亚洲| 久久久久亚洲AV成人无码| 四虎在线视频免费观看| 三年片在线观看免费西瓜视频| 中文字幕无码精品亚洲资源网久久 | 成人au免费视频影院| 好湿好大好紧好爽免费视频|