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: