2010-11-26 75 views
9
  • See this related question for Postgres。出于某种原因,该解决方案对我无效 - 插入语句的返回值始终为“1”。
  • 请参阅XML based solution的其他问题。我想在不使用XML的情况下做同样的事情 - 插入一条记录并找到刚刚添加的记录的新自动生成的ID。

我没有找到匹配的注释<selectkey>(见本open issue) 如何进行?如何返回ids插入mybatis在mysql中带注释

检查mybatis代码揭示INSERT是通过UPDATE实现的,并且总是返回插入行的数量!所以......除非我完全错过了一些东西,否则无法使用当前的(3.0.3)实现来实现这一点。

回答

12

<insert>,<update><delete>语句返回受影响行的数量,这与数据库API常见的相同。

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

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

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

1

你可以从节约的方法让你生成的ID, 可以说与ID和名称属性的bean,

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

假设您使用注释选择并使用@Options(useGeneratedKeys = true) – Lucky 2016-03-03 09:16:53

20

其实,这是有可能做到这一点,与@Options注解(前提是你使用AUTO_INCREMENT或数据库中的类似的东西):

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

注意,如果在SomeBean关键属性名为“ID”的部分是没有必要的。还有一个keyColumn属性可用,对于MyBatis无法自己找到主键列的罕见情况。还请注意,通过使用@Options,您正在将您的方法提交给一些默认参数;查阅文档非常重要(链接如下 - 当前版本的第60页)!

(旧的回答)(相当近)@SelectKey注释可用于更复杂的密钥检索(序列,identity()函数...)。下面介绍一下MyBatis 3 User Guide(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);