1. 程式人生 > >oracle結合mybatis 實現自增主鍵的insert和批量insert功能(未完)

oracle結合mybatis 實現自增主鍵的insert和批量insert功能(未完)

一.引子

在最近的一次開發工作中,有自增主鍵這樣的需求,而資料庫使用的是oracle資料庫; 由於oracle 資料庫沒有像mysql和sqlserver 那樣提供自增主鍵的功能,所以在這裡需要換一種思維去實現自增主鍵的功能!進而我們需要引入[序列]的概念!

二.序列的概念

序列:是oracle提供的用於產生一系列唯一數字的資料庫物件。
序列有以下幾種特徵:

 1. 自動提供衛衣的數值;
 2. 共享物件
 3. 用於提供主鍵值
 4. 將序列值裝入記憶體可以提高訪問效率

三.建立序列

--建立一個序列,序列名字叫SEQ_StudentInfo_Identity
--建立一個序列(序列名的規則一般建議是以SEQ開頭,然後下劃線,後面跟你的表名,表名前的T_可以去掉,然後以_Identity結尾,用來表示我這個序列是用在Id自增欄位的序列)
create sequence SEQ_StudentInfo_Identity increment by 1 --每次增加幾個,我這裡是每次增加1 start with 1 --從1開始計數 nomaxvalue --不設定最大值 nocycle --一直累加,不迴圈 nocache; --不建緩衝區

問題:為什麼不用觸發器?
開發中遇到問題之後,我先在網上查了些資料,發現好多推薦使用觸發器;使用觸發器確實能夠省時省成本,但與同事溝通過之後發現生產環境是不允許使用觸發器的,基本原因有二,一個是維護成本高;線上環境資料庫問題由DBA處理,研發無法介入;二是對於目前的伺服器環境會有效率問題;所以放棄觸發器;

四.什麼是觸發器?

五.觸發器的效能

六.mybatis sql語句

由於在之前 已經執行過建立序列的語句,所以可以直接使用序列的函式nextVal了!這個函式簡單來說可以得到一個數值,可以是上一個主鍵加一的結果,或者1;知道這些之後,讓我們在mapper檔案中加入如下語句

<!-- 序列 -->
  <sql id='TABLE_SEQUENCE'>SEQ_FSO_ACTIVITY_USER_SIGN_UP.nextVal</sql>

此語句用於引入;
然後建立insert節點

<insert id="insert" parameterType="x x.x x.x.x.x.x.x.SignUp" >
    insert into SignUp (ID, PRODUCT_CODE, STATUS, 
      U_ID, REAL_NAME, CREATE_TIME
      )
    values (<include refid="TABLE_SEQUENCE" />, #{productCode,jdbcType=VARCHAR
}
, #{status,jdbcType=CHAR}, #{uId,jdbcType=VARCHAR}, #{realName,jdbcType=VARCHAR}, #{createTime,jdbcType=VARCHAR} ) </insert>

此句中的 這句話是引入剛剛建立的sql片段;意思是將序列生成的數值作為ID插入到資料表中,其他value還是使用變數
至此自動主鍵的功能已實現;新手需要注意每個insert 的ID的值都要使用序列的nextVal函式 不然會出現可想而知的問題!