oracle数据库获取自增id的方法与mysql不一样,后者通过设置useGeneratedKeys和keyProperty即可实现。
但是oralce数据库自增是通过自定义的sequence队列。所以方法上有所不同。
自增队列:
create or replace trigger tib_ar_account before insert
on ar_account for each row
declare
integrity_error exception;
errno integer;
errmsg char(200);
dummy integer;
found boolean;
begin
-- Column "id" uses sequence Sequence_1
select Sequence_1.NEXTVAL INTO :new.id from dual;
-- Errors handling
exception
when integrity_error then
raise_application_error(errno, errmsg);
end;
mapper:
<insert id="insertAccount" parameterType="Account">
<!-- 在插入语句之后获取当前id -->
<selectKey keyProperty="id" resultType="int" order="AFTER">
SELECT Sequence_1.CURRVAL FROM DUAL
</selectKey>
INSERT INTO AR_ACCOUNT (username, money) values( #{username}, #{money})
</insert>
网上看了很多方法都是在插入之前获得队列的下一个id即用了,sequence.nextval,在sql语句中再写插入id,在我自己的实践中发现,这样会导致返回的自增值和数据库的值不一致!!
<insert id="insertAccount" parameterType="Account">
<!-- 在插入语句之后获取当前id -->
<selectKey keyProperty="id" resultType="int" order="BEFORE">
SELECT Sequence_1.NEXTVAL FROM DUAL
</selectKey>
INSERT INTO AR_ACCOUNT (username, money) values( #{username}, #{money})
</insert>
如上,网上的大部分方法都是这个,但是这个会导致主键自增1变成自增2了,原因是获取序列的时候自增了1,插入的时候又自增了1,所以最后数据库中的主键自增了2.