Este ejemplo tiene 3 paquetes con 4 clases en total. Representa una mini-librería:
com.booksellerdb4o.data
com.booksellerdb4o.domain
- Libro: Es el objeto que guardaremos en la base de datos db4o. Contiene los atributos y métodos necesarios para acceder al objeto y guardar/leer datos.
com.booksellerdb4o.view
- BookSeller: Clase principal del proyecto que ejecuta la conexión la base de datos. Tiene un campo de texto que filtra los datos de un JTable. Accede a la otra clase y elimina objetos.
- EditBook: Clase que puede crear o editar según que botón se haya pulsado en la clase BookSeller.
Vamos a entrar un poquito mas a fondo en cada clase, sin explicar todo:
DataConnection
Esta clase está explicada en un ejemplo anterior: Java y Java Swing – Patrón Singleton en db4o
Libro
Es una clase simple que es el objeto que se crea para almacenar en db4o. Contiene atributos y métodos getters y setters únicamente.
BookSeller
Ésta clase es la principal del proyecto. Contiene un JTextField que permite filtrar los datos de un JTable al escribir y pulsar enter. Funciona como un LIKE, ya que filtra por nombre, pero por fragmentos, no por el nombre entero.
Contiene también 4 botones: Nuevo y edita (llama a la ventana EditBook), elimina que sale un JOptionPane preguntando si se quiere eliminar o no, y un botón Salir que sale del programa.
Si profundizamos un poco más vemos como se hace el filtro:
Al pulsar enter llama a un método que en parte contiene:
Código:
List<Libro> ps = null; if (txtCategoria.getText().equals("")) {//Si el campo esta vacio
ps = db.query(Libro.class);//Mostramos todos los libros
} else {//Si el campo contiene algo
ps = db.query(new Predicate<Libro>() {
public boolean match(Libro o) {
return o.getNombre().toLowerCase().contains(txtCategoria.getText().toLowerCase());//Convertimos a minúscula y comparamos
}
}, new Comparator<Libro>() {
public int compare(Libro o1, Libro o2) {
return 0;
}
});
}
Esta clase también permite eliminar los objetos directamente desde la tabla, con el código siguiente:
Código:
if(table.getSelectedRow() != -1){ int confirmado = JOptionPane.showConfirmDialog(frmBookseller, "¿Desea eliminar "+table.getValueAt(table.getSelectedRow(), 0)+"?");
if (JOptionPane.OK_OPTION == confirmado){
Libro l = (Libro)modelo.getValueAt(table.getSelectedRow(), 3);
db.delete(l);
db.commit();
vaciarTabla();
rellenarTabla();
}
}else{
JOptionPane.showMessageDialog(frmBookseller,"Tienes que seleccionar alguna opción");
}
También tiene otras cosas como abrir otras ventanas pasando parámetros:
Código:
editBook = new EditBook((Libro)modelo.getValueAt(table.getSelectedRow(), 3),true);editBook.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
editBook.setVisible(true);
EditBook
Esta clase recibe parámetros para saber si estamos editando o creando (un boolean). Hace consultas a la base de datos db4o para comprobar por ejemplo que el ISBN no exista antes de crearlo:
Código:
if(!edita){ //Comprueba si ya existe el código
Libro l1 = new Libro();
l1.setIsbn(isbn);
lt = db.queryByExample(l1);
}
if(lt.size() == 0) ....
y guarda datos:
Código:
db.store(lli);
db.commit();
También rellena los datos en sus respectivos campos si estamos editando:
Código:
if(edita){ txtISBN.setText(libro.getIsbn()+"");
txtNombre.setText(libro.getNombre());
txtPrecio.setText(libro.getPreu()+"");
cmbAutor.setText(libro.getAutor());
cmbCategoria.setText(libro.getCategoria());
}
Todo esto y mas cosas como por ejemplo:
- Ventanas modales para que no se pueda tocar la ventana de detras, y que se actualice la tabla al cerrar la ventana de edición/creación
- Evitar la edición de celdas de JTable con isCellEditable
- Vaciar un JTable
- …
El ejemplo lo podéis encontrar aqui: