如何使用 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 看到更新后的状态并且看不到某些人所做的更改并发更新。同样,您是否需要它取决于您使用的数据库。
如果我用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 看到更新后的状态并且看不到某些人所做的更改并发更新。同样,您是否需要它取决于您使用的数据库。