1. 程式人生 > >MyBatis+Oracle實現主鍵自增長的幾種常用方式

MyBatis+Oracle實現主鍵自增長的幾種常用方式

在最近做專案中,SSM框架+Oracle資料庫,遇到前臺沒有傳遞主鍵值,需要在插入資料的時候實現主鍵自增長,因為oracle沒有如同SqlServer和mysql一樣的主鍵自增長的設計,所以只能迂迴實現,先將我的實現方法記錄如下:

一、使用selectKey標籤

<insert id="addLoginLog" parameterType="map" >
  		<selectKey  keyProperty="id" resultType="int" order="BEFORE">
  			select nvl(max(id),0)+1 from ap_loginlog
  		</selectKey>
  		insert into ap_loginlog(ID,MEMBER_ID) values(#{id},#{memberId})
  </insert>
keyProperty是指vo類中的主鍵屬性名稱,resultType是指vo類中的主鍵屬性型別,order有兩個屬性,一個是AFTER是指限制性插入語句,一個是BEFORE是指先執行selectKey標籤內的語句:select nvl(max(主鍵名),0)+1 from 表名

二、使用序列

首先建立序列

CREATE SEQUENCE loginlog_squence   
INCREMENT BY 1  
NOMAXVALUE  
NOCYCLE  
CACHE 10;  
然後再sql語句中插入
<insert id="addLoginLog" parameterType="map" >
  	insert into ap_loginlog(ID,MEMBER_ID) values(loginlog_squence.nextval,#{memberId})
  </insert>
三、使用序列加觸發器
create or replace trigger loginlog_trigger  before insert on ap_loginlog    
  for each row  
begin  
  select loginlog_sequence.nextval into :new.id from dual;  
end loginlog_trigger;  
/  
然後再sql語句中插入
<insert id="addLoginLog" parameterType="map" >
  	insert into ap_loginlog(MEMBER_ID) values(#{memberId})
  </insert>

以上三種方式是我覺得比較常用的,或許也有別的方法,可是我不是很清楚,希望大家也給我提提意見,讓我也豐富一下這一方面的知識,在以後的工作中能夠多一種選擇。這三種方法可以適應很多場合,這個就需要按照實際需求去選擇其中一個方法。