0

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

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

有什么建议吗?:)

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
4

1 回答 1

0

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

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

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

于 2012-08-11T12:37:49.987 回答