jueves, 2 de diciembre de 2010

Obtener campo autonumérico de un INSERT en Java

En el curso de RIA que estamos realizando, estamos haciendo un ejercicio de una agenda de contactos. Tenemos una pantalla donde enseñamos un listado de los contactos de un 'DataGrid'. Cuando insertamos un usuario, mandamos la los datos a través de un 'HTTPService' que llama a un servlet. Después en la parte cliente, para no tener que recargar de nuevo todos los datos del datagrid con otra llamada al servidor, insertamos un nodo nuevo en el 'XMLListCollection' que hace de data provider de nuestro datagrid.
Hasta aquí todo va bien, el problema es que cuando insertamos el nodo nuevo es necesario que la llamada al servicio de insertar nos devuelva el id que se ha creado nuevo en la base de datos(valor autonumérico), para en un futuro poder manipular ese contacto nuevo, por ejemplo si lo queremos borrar.

01           Class.forName( "com.mysql.jdbc.Driver" ).newInstance();
02           conn = DriverManager.getConnection( "jdbc:mysql://localhost/ria", "usr", "pwd" );
03 
04           stm = conn.createStatement();
05           stm.executeUpdate( "INSERT INTO usuarios ( nombre, apellidos )" +
06               "VALUES ( 'Alfonso', 'Pérez' )", Statement.RETURN_GENERATED_KEYS );
07 
08           int id = -1;
09           ResultSet rs = stm.getGeneratedKeys();
10           if( rs.next() ) {
11             id = rs.getInt(1);
12           }
13 
14           stm.close();

El primer cambio que tendremos que hacer para obtener el autonumérico, es cuando hacemos la llamada al método 'executeUpdate', además de pasar como parámetro el SQL, tenemos que pasar la constante que indica que nos devuelva los valores generados. Esta opción no es necesaria en algunas ocasiones, podemos omitir este parámetro, pero en algunas base de datos sino lo ponemos no nos devuelve el valor generado, por lo que cuando queramos los valores autonuméricos, estaría bien añadir este parámetro.
El segundo cambio, de la linea 8 a la 12, es donde obtenemos el valor generado con la llamada a 'stm.getGeneratedKeys'. Este método nos devuelve los valores en un ResultSet, por lo que lo trataremos como a otro ResultSet cualquiera. Como vemos en el código de ejemplo, mi tabla solo tiene un campo de tipo autonumérico, por lo que el valor lo obtenemos con 'rs.getInt(1)', si tuviéramos más de un campo lo obtendríamos con el indice del mismo, empezando en 1.

0 comentarios:

Publicar un comentario

Suscribirse a Enviar comentarios [Atom]

<< Inicio