2012-08-24 75 views
6

Soy un novato en mybatis. Estoy tratando de obtener la identificación del último registro insertado. Mi base de datos es MySQL y mi asignador XML esObtener la identificación del último registro insertado en mybatis

<insert id="insertSelective" parameterType="com.mycom.myproject.db.mybatis.model.FileAttachment" > 
    <selectKey resultType="java.lang.Long" keyProperty="id" order="AFTER" > 
    SELECT LAST_INSERT_ID() as id 
</selectKey> 
insert into fileAttachment 
<trim prefix="(" suffix=")" suffixOverrides="," > 
    <if test="name != null" > 
    name, 
    </if> 
    <if test="attachmentFileSize != null" > 
    size, 
    </if>  
</trim> 
<trim prefix="values (" suffix=")" suffixOverrides="," > 
    <if test="name != null" > 
    #{name,jdbcType=VARCHAR}, 
    </if> 
<if test="attachmentFileSize != null" > 
    #{attachmentFileSize,jdbcType=INTEGER}, 
    </if> 
</trim> 
</insert> 

pensé declaración escrita aquí 'SELECT LAST_INSERT_ID() como el ID' debe devolver id del último registro insertado pero yo estoy haciendo siempre 1 después de insertar el disco.

Mi clase mapper.java tengo método

int insertSelective(FileAttachment record); 

En mi clase DAO estoy usando

int id = fileAttachmentMapper.insertSelective (fileAttachment);

estoy recibiendo valor de Id siempre 1 cuando se inserta el nuevo registro. mi campo Id se incrementa automáticamente y los registros se están insertando correctamente.

Respuesta

13

El ello se inyecta en el objeto:

int num_of_record_inserted = fileAttachmentMapper.insertSelective(fileAttachment); 

int id = fileAttachment.getId(); 

Lo selectKey hace es especificar el id en el objeto que va a insertar, en este caso en fileAttachment en su propiedad id y después de insertar registro.

+0

eso es genial jddsantaella ... ¿este subproceso es seguro? – user965884

+0

No lo sé, pero confío en myBatis así que diría que sí. – jddsantaella

+0

Bueno ... gracias Jddsantaella – user965884

1

creo que el 1 que está siendo devuelto se refiere a la cantidad de registros que se actualiza/insertan. Creo que la identificación se establece en el parámetro fileAttachment que pasaste a la llamada para insertar Selectivelective.

+0

Gracias por la respuesta Ed, por lo que entonces ¿cómo puedo conseguir que la identificación? – user965884

6

Sólo tiene que utilizar

<insert id="insert" parameterType="com.mycom.myproject.db.mybatis.model.FileAttachment" useGeneratedKeys="true" keyProperty="id" keyColumn="id"> 

No hay necesidad de ejecutar consulta de selección dentro de la etiqueta de inserción en MyBatis. Le proporciona nuevo parámetro para definir inserción operation.Here useGeneratedKeys = "true", propiedadClave = "id", KeyColumn = "id" Usted puede retrive valor de id en el siguiente manera

FileAttachment fileAttachment=fileAttachmentMapper.insertSelective(fileAttachment); 
    Integer id=fileAttachment.getId(); 

fileAttachment.getId() se utiliza porque en la etiqueta de inserción keyColumn = "id" se define y obtendrá todos los valores de retorno dentro de la referencia FileAttachment de FileAttachment.

0

espero que en el escritor, que puede tener un escritor de encargo compuesto y allí se puede obtener los identificadores insertados.

0

(1) Añadiendo a la respuesta de Ruju, en la declaración de inserción debe definir el atributo useGeneratedKeys = true, parameterType = "object", keyProperty = "objectId" y keyColumn = "objectId" se debe establecer con la misma clave primaria nombre de columna (Id. de objeto) de la tabla que almacena el registro de objeto. La columna de clave principal (Id. De objeto) debe establecerse en AUTO_INCREMENT en la tabla de la base de datos.

(2) Cuando se desencadena la instrucción de inserción, la nueva clave primaria generada (objectId) se almacenará en el objeto, y puede recuperarla accediendo a la propiedad objectId utilizando estos métodos (object.getObjectId() u object.objectId) Ahora esto debería dar la primaria generada exacta y nueva. Se trabajó para mí ....

3

De hecho, MyBatis ya ha proporcionado esta feature.You puede utilizar la opción: "useGeneratedKeys" para conseguir la última Identificación del inserto.

Aquí está la explicación de MyBatis. (Si desea conocer información más detallada, se puede ir a la página oficial de MyBatis).

useGeneratedKeys (de inserción y actualización solamente) Esto le indica a MyBatis utilizar el método de JDBC getGeneratedKeys para recuperar claves generadas internamente por la base de datos (por ejemplo, campos de incremento automático en RDBMS como MySQL o SQL Server). Por defecto: false

Si está utilizando xml:

<insert id="" parameterType="" useGeneratedKeys="true"> 

Si está utilizando anotación:

@Insert("your sql goes here") 
@Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id") 
int insert(FileAttachment fileAttachment) throws Exception; 

Una vez que termine la operación de inserción, el método de la fileAttachment setId() será invocado, y se establece en id del último registro insertado. Se puede utilizar de fileAttachment getId() para conseguir la última Identificación del inserto.

Espero que esto te ayude.

Cuestiones relacionadas