【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