oracle数据库在mybatis框架中获取自增id

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.

猜你喜欢

转载自blog.csdn.net/weixin_42070871/article/details/83186230