【MyBatis/Oracle】利用Oracle的序列Sequence 达成插入记录返回ID的处理小技巧

Oracle数据库中,ID的生成机制多见使用sequence,如Mapper层的以下函数:

    @Insert(" insert into dmo_task(id,project_id,table_name,fromDsIdx,toDsIdx,userid) values(dmo_task_id_sqs.nextval,#{pid},#{name},#{fromDsIdx},#{toDsIdx},#{uid}) ")
    int addOne(@Param("pid") long pid, @Param("name") String tablename,  @Param("fromDsIdx") long fromDsIdx, @Param("toDsIdx") long toDsIdx, @Param("uid") long uid);

其中,dmo_task_id_sqs就是Sequecne的名称,dmo_task_id_sqs.nextval即新纪录里ID字段的取值。

 

但有时候,由于对象的连贯性,插完记录后希望能返回ID,那么上面的函数需要一分为二:

    @Select(" select dmo_task_id_sqs.nextval from dual")
    long generateId();

    @Insert(" insert into dmo_task(id,project_id,table_name,fromDsIdx,toDsIdx,userid) values(#{id},#{pid},#{name},#{fromDsIdx},#{toDsIdx},#{uid}) ")
    int addOne2(@Param("id") long id,@Param("pid") long pid, @Param("name") String tablename,  @Param("fromDsIdx") long fromDsIdx, @Param("toDsIdx") long toDsIdx, @Param("uid") long uid);

 

在Service层则这样调用:

    public synchronized long addOne2(long pid,String tableName,long fromDsIdx,long toDsIdx,long uid){
        long id=taskMpr.generateId();
        int changed=taskMpr.addOne2(id,pid,tableName,fromDsIdx,toDsIdx,uid);

        if(changed==1){
            return id;
        }

        return -1;
    }

 

这样处理后,既方便了后面的语句,又不会造成id被占用的异常,代价是串行处理,效率低了一点。

 

【参考资料】

https://www.cnblogs.com/tomtiantao/p/6866100.html

END

 
posted @ 2022-03-26 17:09  逆火狂飙  阅读(716)  评论(0编辑  收藏  举报
生当作人杰 死亦为鬼雄 至今思项羽 不肯过江东