• 【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

     
  • 相关阅读:
    Spring 资源文件处理
    Mysql Illegal mix of collations (utf8_unicode_ci,IMPLICIT) and (utf8_general_ci,IMPLICIT) for operation '='
    JAVA NIO Socket通道
    JAVA NIO FileChannel 内存映射文件
    JAVA NIO Scatter/Gather(矢量IO)
    JAVA NIO Channel
    JAVA NIO Buffer
    MTU(Maximum transmission unit) 最大传输单元
    TCP建立连接之三次握手
    TCP首部解析
  • 原文地址:https://www.cnblogs.com/heyang78/p/16059941.html
Copyright © 2020-2023  润新知