oracle結合mybatis 實現自增主鍵的insert和批量insert功能(未完)
阿新 • • 發佈:2019-02-08
一.引子
在最近的一次開發工作中,有自增主鍵這樣的需求,而資料庫使用的是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函式 不然會出現可想而知的問題!