【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被占用的异常,代价是串行处理,效率低了一点。

【参考资料】

END

 

相关