如何使用 mybatis 获取更新行?

How can I get update rows with mybatis?

如果我用mybatis,我可以很容易的得到更新的行数,就像

update table set desc = 'xxx' where name = ?

但是,如果我想获取更新的行,而不是计数,我该如何通过mybatis实现呢?

mybatis 本身无法做到这一点,因为此更新发生在数据库中并且没有行数据返回。

唯一的选择是修改查询并使其更新和select您需要的数据。如何实现此效果的确切方式取决于您使用的数据库 and/or 驱动程序支持。

例如,在 postgres 中,您可以更改查询并添加 RETURNING clause,如下所示:

UPDATE table
SET desc = 'xxx'
WHERE name = ?
RETURNING *

这会将此查询转换为 select 查询,您可以将其映射为 mybatis 中的 select 查询。其他一些数据库也有类似的功能。

另一个选项(如果你的数据库 and/or JDBC 驱动程序支持这个)是做两个查询,更新和 select 像这样

<select id='updateAndReturnModified" resultMap="...">
    UPDATE table
    SET desc = 'xxx'
    WHERE name = @{name};
    SELECT *
    FROM table
    WHERE name = @{name};
</select>

然而,这可能需要使用更严格的隔离级别(例如 READ_COMMITED 将不起作用)以确保第二个 select 看到更新后的状态并且看不到某些人所做的更改并发更新。同样,您是否需要它取决于您使用的数据库。