Java y consultas a MySQL (II)

————————
TUTORIAL MYSQL:
————————
I. Instalación y arranque, creación de BDs y tablas, introducción y visualización de datos
II. Actualización de datos, eliminación y alteración de las BDs y las tablas
III. Consultas a MySQL desde un programa Java, Primera parte
IV. Consultas a MySQL desde un programa Java, Segunda parte
————————

Retomamos el proyecto Java con el que estábamos trabajando en la parte anterior del tutorial de mysql para ver por fin una aplicación introduciendo y extrayendo datos de una BD. No es un caso real, pero el ejemplo creo que será bastante claro de cómo llegar a buen puerto…

Como sé que el codigo Java no es muy cómodo de leer a través del blog, he subido los códigos fuente de todo este post en un fichero .zip que podéis importar a Netbeans en el menú “File/Import Project/From Zip…”: Tutorial_SQL

Comenzaré por crear una clase Libro que modele los objetos que estamos almacenando en la BD. Por comodidad solo he definido métodos de lectura y he sobreescrito el “toString()” (mediante “@Override”) para que devuelva un String con los atributos separados por ” || “.

public class Libro {

private String isbn;
private String titulo;
private String autor;
private double precio;
private int stock;

public Libro(String i, String t, String a, double p, int s){
isbn=i;
titulo=t;
autor=a;
precio=p;
stock=s;
}

public String getIsbn(){
return isbn;
}

public String getTitulo(){
return titulo;
}

public String getAutor(){
return autor;
}

public double getPrecio(){
return precio;
}

public int getStock(){
return stock;
}

@Override
public String toString(){
return isbn+" || "+titulo+" || "+autor+" || "+precio+" || "+stock;
}

}

Una vez definida la clase Libro, vamos a realizar unos pequeños cambios en la clase “BDMgr.java” que ya habíamos soslayado: vamos a pasar a privado el método con el que ejecutábamos una consulta (antes llamado “parseQuery”, ahora llamado “get”) y crear otro que transforme los resultados a un ArrayList de Libros tal que así:

private static ResultSet get(String q){
ResultSet rs = null;
try {
rs=st.executeQuery(q);
} catch (SQLException ex) {
Logger.getLogger(BDMgr.class.getName()).log(Level.SEVERE, null, ex);
}
return rs;
}

private ArrayList<libro> getLibros(String q){
ArrayList<libro> libros=new ArrayList();
Libro unLibro;
ResultSet rs=get(q);
try {
while (rs.next()){
unLibro=new Libro(rs.getString("isbn"),rs.getString("titulo"),rs.getString("autor"),rs.getDouble("precio"),rs.getInt("stock"));
libros.add(unLibro);
}
} catch (SQLException ex) {
Logger.getLogger(BDMgr.class.getName()).log(Level.SEVERE, null, ex);
}
return libros;
}

En cuanto al método “get()” no hay mucho que explicar: seguirá ejecutando la query que reciba.
Sin embargo el método “getLibros(String q)” sí que tiene algo de chicha. En la línea:
ResultSet rs=get(q);
enviamos la consulta y recogemos el ResultSet. Ahora en el try-catch podemos iniciar un bucle para cada elemento de “rs” en el que se crea el objeto “unLibro” con los atributos que leemos del elemento de “rs”, y además lo añadimos al ArrayList.
Fíjate que para leer los atributos hay que utilizar un método de ResultSet con el nombre de la columna donde se encuentra el dato. Por ejemplo:
rs.getString("titulo")
o:
rs.getDouble("precio")

Una vez que tenemos esto, podemos ya definir métodos públicos que devuelvan colecciones habituales de Java:

public ArrayList<Libro> getLibros(){
return getLibros("select * from libros;");
}

public ArrayList<Libro> getLibrosConISBN(String isbn){
return getLibros("select * from libros where isbn="+isbn+";");
}

Esos ArrayList serán mucho más cómodos de manejar que los ResultSet, y harán que nuestra aplicación sea independiente de la tecnología de bases de datos que usemos, porque ya no tendrán que preocuparse de importar estas clases.

Y ¿si queremos insertar, modificar, eliminar? Dentro de “get()” estamos utilizando “executeQuery()” pero este método no nos sirve para este tipo de operaciones y lanzará excepciones. Así que crearé un método “set()” apropiado:


private static void set(String q){
try {
st.executeUpdate(q);
} catch (SQLException ex) {
Logger.getLogger(BDMgr.class.getName()).log(Level.SEVERE, null, ex);
}
}

El código es bastante similar excepto por el uso de “executeUpdate()” y porque no se retorna ningún valor. Mediante mi método “set()” ya puedo implementar otros, como por ejemplo:


public void venderLibro(Libro l){
int nuevoStock=l.getStock()-1;
String isbn=l.getIsbn();
set("update libros set stock="+nuevoStock+" where isbn="+isbn+";");
}

Como ves, estas pequeñas operaciones de ejemplo son muy sencillas (y probablemente inseguras porque no hago ningún tipo de comprobación…) pero creo que reflejan muy claramente la mecánica de trabajo con una BD desde una aplicación Java.
Podemos correr alguna prueba creando un pequeño “main()” que yo situaré en una clase llamada “Programa.java”:

public class Programa {

public static void main(String[] args){
BDMgr bdm=new BDMgr();
ArrayList libros;
System.out.println();

System.out.println("Mostrar todos los libros");
libros=bdm.getLibros();
for (Libro l : libros){
System.out.println (l.toString());
}
System.out.println();

System.out.println("Mostrar un libro con ISBN 9788441529373");
libros=bdm.getLibrosConISBN("9788441529373");
for (Libro l : libros){
System.out.println(l.toString());
}
System.out.println();

System.out.println("Vender ese libro");
libros=bdm.getLibrosConISBN("9788441529373");
for (Libro l : libros){
bdm.venderLibro(l);
}
System.out.println();

System.out.println("Mostrar todos los libros");
libros=bdm.getLibros();
for (Libro l : libros){
System.out.println(l.toString());
}
System.out.println();
}

}

Si lo ejecutas, debería mostrar todos los libros en la BD, luego el libro de Joan Ribas Lequerica y por último de nuevo todos los libros pero esta vez deberíamos ver cómo el stock ha disminuido.

————————
TUTORIAL MYSQL:
————————
I. Instalación y arranque, creación de BDs y tablas, introducción y visualización de datos
II. Actualización de datos, eliminación y alteración de las BDs y las tablas
III. Consultas a MySQL desde un programa Java, Primera parte
IV. Consultas a MySQL desde un programa Java, Segunda parte
————————

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s