Sql2o Simplifica el acceso a datos JDBC

Sql2o es un pequeño framework Java que ayudará a simplificar el acceso a datos, esta librería utiliza internamente la API JDBC para lanzar las consultas contra la base de datos, la misma realizará el trabajo repetitivo, cómo: manejo de excepciones, mapeo de datos, etc., esto nos permite centrarnos en lo que realmente nos interesa y agiliza el proceso de desarrollo ya que debemos escribir menos código.

Sql2o ha sido probado para trabajar con los siguientes drivers: PostgreSQL, MySQL, Oracle, MS Sql Server, IBM DB2, H2 y HyperSQL.

Requerimos las siguientes dependencias Maven:

<dependency>
    <groupId>org.sql2o</groupId>
    <artifactId>sql2o</artifactId>
    <version>1.5.4</version>
</dependency>

Dependiendo del motor de datos que vayas a utilizar recuerda agregar el correspondiente driver, nosotros usaremos MySQL.

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.41</version>
</dependency>

Para nuestra demostración crearemos una base de datos a la que llamaremos tienda, y le añadiremos una tabla llamada producto, usamos el siguiente script:

DROP DATABASE IF EXISTS `tienda`;
CREATE SCHEMA `tienda`;

CREATE TABLE `tienda`.`producto` (
  `id` BIGINT NOT NULL AUTO_INCREMENT,
  `nombre` VARCHAR(45) NOT NULL,
  `precio` DECIMAL(5, 2) NULL,
  `cantidad` INT NULL,
  `fecha` DATE NULL,
  PRIMARY KEY (`id`));

INSERT INTO `tienda`.`producto` VALUES (1, 'arroz',   1.25, 22, '10/12/16');
INSERT INTO `tienda`.`producto` VALUES (2, 'cebolla', 2.75, 20, '01/11/17');
INSERT INTO `tienda`.`producto` VALUES (3, 'papas',   0.95, 22, '10/12/16');
INSERT INTO `tienda`.`producto` VALUES (4, 'poroto',  3.45, 10, '01/11/17');
INSERT INTO `tienda`.`producto` VALUES (5, 'azucar',  1.05, 12, '10/12/16');
INSERT INTO `tienda`.`producto` VALUES (6, 'aceite',  5.15, 50, '01/11/17');

Para representar la tabla producto como un objeto Java crearemos la correspondiente clase, usaremos lombok para generar los métodos getter y setter necesarios.

@Data
public class Producto {

    private Long id;
    private String nombre;
    private Double precio;
    private Integer cantidad;
    private Date fecha;
}

Conectar con la base de datos

Para realizar la conexión debemos crear un objeto Sql2o e indicarle en el constructor la URL, el usuario y la contraseña, usando el método open() abrimos la conexión.

String url = "jdbc:mysql://localhost:3306/tienda";
Sql2o sql2o = new Sql2o(url, "user", "pass");

try (Connection con = sql2o.open()) {

    System.out.println("coneccion abierta...");
}

Ya podemos realizar consultas, imaginamos que deseamos obtener una lista de todos los productos, usaremos createQuery("...") para crear la consulta, executeAndFetch() devuelve el resultado mapeando la columnas al tipo indicado.

try (Connection con = sql2o.open()) {

    String sql = "SELECT * FROM producto;";

    List<Producto> result = con
            .createQuery(sql)
            .executeAndFetch(Producto.class);
    
    result.forEach(System.out::println);
}

Es posible usar parámetros con nombre en las consultas, por ejemplo, deseamos obtener los productos que tienen una cantidad menor o igual a 20 unidades, lo hacemos de este modo:

try (Connection con = sql2o.open()) {

    String sql = "SELECT * FROM producto WHERE cantidad <= :cantidad";

    List<Producto> result = con
            .createQuery(sql)
            .addParameter("cantidad", 20)
            .executeAndFetch(Producto.class);

    result.forEach(System.out::println);
}

Usando el método addParameter(...) establecemos el valor para el parámetro indicado, en nuestro caso se llama cantidad, lo demás permanece igual.

Insertar, Actualizar, Eliminar

En caso de que deseemos agregar un dato, el proceso es similar solo cambia el uso del método executeUpdate() al final, para enviar la consulta de inserción.

try (Connection con = sql2o.open()) {
    
    Producto p = new Producto(null, "pescado", 7.50, 100, Date.from(Instant.now()));
    
    String sql = "INSERT INTO producto "
            + "VALUES(:id, :nombre, :precio, :cantidad, :fecha)";
    
    con.createQuery(sql)
            .addParameter("id"      , p.getId())
            .addParameter("nombre"  , p.getNombre())
            .addParameter("precio"  , p.getPrecio())
            .addParameter("cantidad", p.getCantidad())
            .addParameter("fecha"   , p.getFecha())
            .executeUpdate();      
    
    productList(con);
}

Una actualización o eliminación se realiza de modo similar, solo debemos cambiar la consulta por los correspondientes UDPATE o DELETE y agregar los parámetros necesarios para las mismas.

Otras cosas que puedes hacer con este framework, son: manejo de transacciones, si el nombre de las columnas y las propiedades de la clase no concuerdan puedes indicarlo, otras.

Comentarios

Temas relacionados

Entradas populares de este blog

tkinter Grid

tkinter Canvas

Controles y Contenedores JavaFX 8 - I

Conectar SQL Server con Java