Last ID, iBATIS y MySql
Adicto como soy a las claves primarias auto-incrementales en MySql me perseguía el problema de no saber cuál era el ID con el que el último registro había sido insertado.
Esto me obliga a hacer indecorosos malabarismos para conseguirlo: sincronizar el método y solicitar el último ID insertado justo después de la inserción, solicitar la ID del registro por algún otro campo de clave única…
Hoy me dá por googlear un poco y me encuentro con una joyita del 2005 entre los archivos de una lista de correo.
Aquí está la solución para que la propia llamada al ‘insert’ te retorne el ID creado:
Si por ejemplo tenemos esta sentencia ‘insert’ en nuestro fichero de iBATIS:
<insert id="insertSentence" > insert into MY_TABLE ( FIELD_1, FIELD_2 ) values ( #value1#, #value2# ) </insert>
Hay que modificarla de esta manera:
<insert id="insertSentence" > insert into MY_TABLE ( FIELD_1, FIELD_2 ) values ( #value1#, #value2# ) <selectKey resultClass="long" keyProperty="ID" > select LAST_INSERT_ID() </selectKey> </insert>
Y el ID podrás recogerlo desde la llamada al mapeador de iBATIS:
Long key = (Long) sqlMap.insert( "insertSentence" );
Ahora soy un poquitín más feliz… espero que tú también.
November 28th, 2007 at 8:20 pm
Sí señor, yo también soy un poquito más feliz.
Sólo un comentario: el valor de la keyProperty=”ID”, debe coincidir con el nombre del atributo correspondiente a la columna auto-incremental del objeto que se inserta. Lo digo por copy-pastes apresurados como el que he hecho yo.
Muchas gracias.
November 28th, 2007 at 8:30 pm
Gracias por la aclaración Rubén ;)
April 23rd, 2008 at 11:32 am
me ha sido muy útil. gracias!
June 15th, 2009 at 1:53 am
si, efectivamente muy util, gracias!
Una pregunta que no tiene mucho que ver con llaves auto-incrementales, tu me podrias aconsejar un poquito para manejar con seguridad mis archivos de configuracion (los xml) y que, en caso de un ataque hackeril no puedan leer el archivo que contiene datos tan preciados como mi servidor de base de datos, contraseña y demás? GRacias nuevamenteeeee