【问题标题】:MyBatis do a fetch and based on return value do an update/insert inside the Xxxmapper.xml?MyBatis 进行获取并根据返回值在 Xxxmapper.xml 中进行更新/插入?
【发布时间】:2015-03-13 01:12:32
【问题描述】:

有没有办法在 Mybatis Insert SQL 配置中嵌入 select from table,检查记录是否存在 -> 在同一张表上运行更新
否则只是插入数据。 我知道它可以通过编程方式完成,但需要一种方法在 mapper.xml 中完成

数据库:Oracle 11g、mybatis 3.1.x

任何建议都有帮助

谢谢

【问题讨论】:

  • 任何建议,还有从 Java POJO 生成 mybatis Mapper.xml 的工具吗?。

标签: java sql database mybatis


【解决方案1】:

使用UPSERT语句,大部分数据库支持UPSERT语句。返回值将是更新或插入的记录数。尽管您尚未提供要对其执行更新或插入操作的数据库。

更新

Oracle 11g 确实支持 upsert

MERGE INTO KP_TBL USING DUAL ON (MY_KEY= #{myKey}) 
        WHEN MATCHED THEN 
                UPDATE SET OTHER_PARAM = #{myOtherParam},
                           SEC_PARAM = #{sec_param}
        WHEN NOT MATCHED THEN
                INSERT (MY_KEY, OTHER_PARAM,SEC_PARAM)  VALUES(#{myKey},#{myOtherParam},#{sec_param)

【讨论】:

  • @KP 数据库是 Oracle DB 11g。
  • Oracle 不支持 upsert 语句,所以我猜这里没有开箱即用的解决方案,必须转向 PL/SQL 等...
  • @KP 谢谢你还想知道我可以在 mybastis 中为 oracle 执行删除插入吗?。
  • @SHinny 我不明白你为什么需要删除插入。删除插入只不过是更新
  • 我得到了更新,有时收到的行数可能比上一次更新少或多,我不想保留过时的数据,所以想删除并再次加载。如果我只更新并且收到的行数较少,我会保留不再需要的数据....
【解决方案2】:

这可以通过 SQL 来完成。不幸的是,您没有提及您使用的特定数据库管理系统,因为 ANSI SQL 中没有这样的功能。 例如,如果您使用 MySQL,INSERT ... ON DUPLICATE KEY UPDATE 就是要走的路。

例如:

<insert id="instSample" parameterType="SampleModel">
   INSERT INTO table (a,b,c) VALUES (#{a}, #{b}, #{c})
   ON DUPLICATE KEY UPDATE c = #{c};
</insert>

【讨论】:

  • 数据库是Oracle DB 11g
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多