如何在 mysql 中使用 mybatis 在带有注释的 Inserts 上返回 id

2022-09-02 02:39:10
  • 请参阅 Postgres 的此相关问题。由于某种原因,解决方案对我不起作用 - 插入语句的返回值始终为“1”。
  • 有关基于 XML 的解决方案,请参阅此其他问题。我想在没有XML的情况下做同样的事情 - 插入一条记录并找到我刚刚删除的记录的新的自动生成的ID。

我没有找到匹配的注释(请参阅此未决问题)如何继续?<selectkey>

检查 mybatis 代码会发现它是通过 实现的,并且始终返回插入行的数量!所以。。。除非我在这里完全错过了一些东西,否则没有办法使用当前的(3.0.3)实现来做到这一点。INSERTUPDATE


答案 1

实际上,可以通过注释来执行此操作(前提是您正在使用auto_increment或数据库中的类似内容):@Options

@Insert("insert into table3 (id, name) values(null, #{name})") 
@Options(useGeneratedKeys=true, keyProperty="idName")
int insertTable3(SomeBean myBean); 

请注意,如果 SomeBean 中的 key 属性名为“id”,则该部件不是必需的。还有一个属性可用,用于MyBatis无法自己找到主键列的极少数情况。另请注意,通过使用 ,您将方法提交到一些默认参数;查阅文档很重要(链接如下 - 当前版本中的第60页)!keyProperty="idName"keyColumn@Options

(旧答案)(相当新的)注释可用于更复杂的密钥检索(序列,identity()函数...)。以下是 MyBatis 3 用户指南 (pdf) 提供的示例:@SelectKey

此示例演示如何使用@SelectKey注释从插入之前的序列中检索值:

@Insert("insert into table3 (id, name) values(#{nameId}, #{name})") 
@SelectKey(statement="call next value for TestSequence", keyProperty="nameId", before=true, resultType=int.class) 
int insertTable3(Name name); 

此示例演示如何使用@SelectKey注释在插入后检索标识值:

@Insert("insert into table2 (name) values(#{name})")
@SelectKey(statement="call identity()", keyProperty="nameId", before=false, resultType=int.class)
int insertTable2(Name name);

答案 2

和 语句返回受影响的行数,这在数据库 API 中很常见。<insert><update><delete>

如果为插入的行生成了新 ID,则该 ID 将反映在作为参数传递的对象中。例如,如果您在带注释的插入方法中调用mapper.insert(someObject),则在插入后,您可以调用someObject.getId(或类似)来检索它。

使用 的选项,您可以调整如何(通过提供 SQL 语句)以及何时(在实际插入之前或之后)生成或检索 id,以及将 ID 放在对象中的位置。<insert>

使用 MyBatis 生成器从数据库模式生成类并查看如何处理插入和更新可能会有启发性。具体而言,生成器生成“示例”类,这些类用作临时容器来传递数据。


推荐