qileilove

          blog已經轉移至github,大家請訪問 http://qaseven.github.io/

          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 返回鍵獲?。?/strong>

            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-06-08 09:40 順其自然EVO 閱讀(821) 評論(0)  編輯  收藏


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


          網站導航:
           
          <2012年6月>
          272829303112
          3456789
          10111213141516
          17181920212223
          24252627282930
          1234567

          導航

          統計

          • 隨筆 - 3936
          • 文章 - 404
          • 評論 - 179
          • 引用 - 0

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 儋州市| 拉孜县| 宝山区| 蓬莱市| 綦江县| 青浦区| 四平市| 白朗县| 西峡县| 林芝县| 塘沽区| 太仓市| 营山县| 阿拉尔市| 杨浦区| 孝昌县| 含山县| 老河口市| 曲水县| 潮安县| 海门市| 元江| 平果县| 柘城县| 湖口县| 嘉定区| 房产| 禄丰县| 河津市| 南部县| 柳林县| 万盛区| 富川| 商城县| 海原县| 财经| 保定市| 东平县| 宁国市| 开封市| 广州市|