2010-11-26 17 views
9
  • See this related question para Postgres. Por alguna razón, la solución no funciona para mí: el valor de retorno de la declaración de inserción siempre es "1".
  • Consulte esta otra pregunta para un XML based solution. Me gustaría hacer lo mismo sin XML: inserte un registro y busque el nuevo ID generado automáticamente del registro que acabo de inscribir.

no he encontrado una anotación correspondiente a <selectkey> (ver este open issue) ¿Cómo proceder?Cómo devolver identificadores en Encartes con mybatis en mysql con anotaciones

El examen del código mybatis revela que INSERT se implementa a través de UPDATE, y siempre devuelve el número de filas insertadas. Entonces ... a menos que me falta algo por completo aquí, no hay forma de hacerlo usando la implementación actual (3.0.3).

Respuesta

12

Las declaraciones <insert>, <update> y <delete> devuelven el número de filas afectadas, como es común con las API de la base de datos.

Si se genera una nueva ID para la fila insertada, se refleja en el objeto que pasó como parámetro. Entonces, por ejemplo, si llama a mapper.insert (someObject) dentro de su método de inserción anotado, después de insertarlo, puede llamar a someObject.getId (o similar) para recuperarlo.

Utilizando las opciones de <insert>, puede ajustar cómo (proporcionando una instrucción SQL) y cuándo (antes o después de la inserción real) se genera o recupera el ID, y dónde se coloca en el objeto.

Puede ser instructivo utilizar MyBatis generator para generar clases desde un esquema de base de datos y ver cómo se manejan las inserciones y actualizaciones. Específicamente, el generador produce clases "de ejemplo" que se usan como contenedores temporales para pasar datos.

1

puede obtener sus identificaciones generados desde save métodos, digamos que un grano con el ID y el nombre de propiedades,

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

Suponiendo que usa la anotación para seleccionar y con '@Options (useGeneratedKeys = true)' – Lucky

20

En realidad, es posible hacerlo, con el @Options anotación (siempre que se está utilizando aUTO_INCREMENT o algo similar en su base de datos):

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

Tenga en cuenta que la parte no es necesario si la propiedad clave en SomeBean se denomina "id". También hay un atributo keyColumn disponible, para los raros casos en que MyBatis no puede encontrar la columna de la clave principal por sí mismo. Tenga en cuenta que al usar @Options, está enviando su método a algunos parámetros predeterminados; es importante consultar el documento (vinculado a continuación - página 60 en la versión actual)!

(respuesta Viejo) La (muy reciente) @SelectKey anotación se puede utilizar para la recuperación más compleja clave (secuencias, función identidad() ...).Esto es lo que la MyBatis 3 User Guide (pdf) ofrece como ejemplos:

Este ejemplo muestra el uso de la anotación @SelectKey para recuperar un valor de una secuencia antes de que un inserción:

@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); 

Este ejemplo muestra usando la anotación @SelectKey para recuperar un valor de identidad después de una inserción:

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