如何在带有注释的mysql中使用mybatis返回插入内容上的id

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

我没有找到与匹配的注释(请参阅此公开问题 )如何继续?

检查mybatis代码表明INSERT是通过UPDATE实现的,并且总是返回插入的行数! 所以…除非我在这里完全遗漏了一些东西,否则使用当前的(3.0.3)实现无法做到这一点。

实际上,可以使用@Options注释(如果您在数据库中使用auto_increment或类似的东西)来执行此操作:

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

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

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

此示例显示使用@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); 

语句返回受影响的行数,这与数据库API一样。

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

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

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

你可以从save方法中获取生成的id,让我们说一个带有ID和name属性的bean,

 bean.setName("xxx"); mapper.save(bean); // here is your id logger.debug(bean.getID);