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

本文详细解析了Oracle数据库中自增ID的实现方法,对比MySQL的简单设置,Oracle使用自定义sequence实现。文章通过触发器示例展示了如何在插入前或后获取序列值,并讨论了不同方法对自增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.

 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值