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

rip*_*234 14 java mysql mybatis

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

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

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

Man*_*nur 29

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

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

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

(旧答案)(最近的)@SelectKey注释可用于更复杂的密钥检索(序列,身份()函数...).以下是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); 
Run Code Online (Sandbox Code Playgroud)

此示例显示使用@SelectKey批注在插入后检索标识值:

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


Dan*_*vak 14

<insert>,<update><delete>语句返回受影响的行数,如与数据库API常见.

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

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

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