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


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


          網站導航:
           
          主站蜘蛛池模板: 前郭尔| 崇阳县| 临夏市| 九江市| 扎兰屯市| 虞城县| 长治县| 祁连县| 岗巴县| 甘南县| 资兴市| 阿坝| 霍邱县| 夏河县| 满城县| 黎城县| 嘉兴市| 修水县| 舒城县| 额尔古纳市| 铁岭县| 建昌县| 出国| 宝坻区| 遵化市| 沐川县| 顺昌县| 松原市| 台东市| 五指山市| 商南县| 沂南县| 阿巴嘎旗| 洛隆县| 乡宁县| 万源市| 深水埗区| 秭归县| 恭城| 斗六市| 友谊县|