用MyBatis映射替换存储过程

时间:2012-08-10 13:10:34

标签: stored-procedures insert sybase mybatis

我找不到MyBatis中的映射示例,我可以用。替换下面的代码。

“if sqlcode<> 0”如果没有更新,则执行插入

任何sugestions? :)

as
begin
  execute SetDefaultIsolationLevel
  update COMPANYLEVEL 
  set 
    companylevelid = @companylevelid, 
    companynameid = @companynameid, 
    level = @level, 
    memo = @memo,
    operator = @operator,
    changed = getdate(*)
  where
    companynameid = @companynameid
  if sqlcode <> 0
  BEGIN
    insert into COMPANYLEVEL 
        (companylevelid,companynameid,level,memo,operator,changed)
    values
        (@companylevelid,@companynameid,@level,@memo,@operator,getdate(*)) 
  END
  commit transaction
end

1 个答案:

答案 0 :(得分:0)

我不认为MyBatis有任何映射说“尝试更新,如果失败则执行插入”。如果您希望在数据库的往返中完成,那么存储过程是合适的。您可以从MyBatis调用此存储过程,但if / else逻辑将位于存储过程中。

如果您试图摆脱存储过程,那么您需要在代码中进行两步检查。 MyBatis中的更新返回更新的行数(通过JDBC驱动程序),因此如果为零,则可以调用MyBatis插入映射。如果发生插入,则需要两次往返数据库。

您还可以在存储过程中使用MERGE语句执行“upsert”,但这当然与MyBatis无关,除了MyBatis可以调用您的存储过程。看起来你在使用Sybase?如果是这样,我不确定Sybase是否有upserts - 链接到研究:Upsert (update or insert) in Sybase ASE?