MyBatis consultar base de datos

El framework MyBatis está diseñado para facilitar y agilizar el acceso a bases de datos SQL, soporta procedimientos almacenados y mapeos avanzados, MyBatis puede ser configurado usando un archivo XML y desde código Java mediante anotaciones, podemos usar la opción de nuestra preferencia o combinar ambas, el presente tutorial se centra en el uso de las anotaciones en próximas publicaciones trataremos la configuración mediante archivos XML.

Para las demostraciones usaremos el motor de datos HSQLDB con sus datos de prueba, en el respectivo enlace se muestra el proceso para iniciar el servidor y añadir la base de datos de prueba.

Acceso a HSQLDB con MyBatis Java

Para realizar una consulta a la tabla CUSTOMER, primero creamos la clase Java que almacenará dichos datos.

public class Customer {

    private Long id;
    private String firstname;
    private String lastname;
    private String street;
    private String city;

    // ...
}

Los correspondientes métodos getter, setter y toString no se muestran por brevedad.

Configurar MyBatis

Antes que nada agregamos la siguiente dependencia Maven, para utilizar el framework MyBatis y también para el motor de datos HSQLDB.

<dependencies>
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.4.4</version>
    </dependency>
    <dependency>
        <groupId>org.hsqldb</groupId>
        <artifactId>hsqldb</artifactId>
        <version>2.4.0</version>
    </dependency>
</dependencies>

Lo primero que debemos agregar es el DataSource, para esto utilizaremos la clase PooledDataSource que provee el framework, debemos indicar el Driver, URL, nombre de usuario y todo lo que sea necesario para conectarnos a la base de datos.

private static DataSource getDataSource() {
    PooledDataSource ds = new PooledDataSource();
    ds.setDriver("org.hsqldb.jdbcDriver");
    ds.setUrl("jdbc:hsqldb:hsql://localhost/");
    ds.setUsername("SA");
    ds.setPassword("");
    return ds;
}

Luego requerimos una instancia SqlSessionFactory, la construiremos utilizando la clase SqlSessionFactoryBuilder que puede generar el objeto requerido a partir de un archivo XML o una clase de configuración Java, ya hemos mencionado que utilizaremos la segunda opción.

DataSource dataSource = getDataSource();

TransactionFactory transactionFactory = new JdbcTransactionFactory();
Environment environment = new Environment("development", transactionFactory, dataSource);

Configuration configuration = new Configuration(environment);
configuration.addMapper(CustomerMapper.class);

SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);

Esta configuración contiene lo siguiente: un objeto DataSource que nos permite conectarnos a la base de datos, un TransactionFactory que establece como se manejarán las transacciones, el objeto Configuration crea la configuración usaremos el método addMapper() del mismo para indicar las clases de mapeo que serán utilizadas.

Esta es nuestra clase de mapeo usando la anotación @Select construimos la respectiva consulta, usando #{ } indicamos que se trata de un parámetro, al invocar este método se ejecutará la consulta con el parámetro indicado y devolverá el objeto establecido.

import org.apache.ibatis.annotations.Select;

public interface CustomerMapper {

    @Select("SELECT * FROM Customer WHERE id = #{id}")
    Customer selectCustomerById(long id);
}

Para lanzar la consulta debemos obtener un objeto SqlSession, usando su método getMapper() obtendremos el mapper indicado que luego podremos utilizar para consultar los datos deseados.

try (SqlSession session = sqlSessionFactory.openSession()) {
    
    CustomerMapper mapper = session.getMapper(CustomerMapper.class);
    Customer customer = mapper.selectCustomerById(10);
    
    System.out.println(customer);
}

El código de ejemplo completo:

public class MyBatisExample {

    public static void main(String[] args) {
        
        DataSource dataSource = getDataSource();

        TransactionFactory transactionFactory = new JdbcTransactionFactory();
        Environment environment = new Environment("development", transactionFactory, dataSource);

        Configuration configuration = new Configuration(environment);
        configuration.addMapper(CustomerMapper.class);

        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);

        try (SqlSession session = sqlSessionFactory.openSession()) {
            
            CustomerMapper mapper = session.getMapper(CustomerMapper.class);
            Customer customer = mapper.selectCustomerById(10);
            
            System.out.println(customer);
        }
    }

    private static DataSource getDataSource() { ... }

}

El resultado, recordemos que necesitamos que el servidor se esté ejecutando.

Customer{id=10, firstname=Anne, lastname=Smith, street=125 - 20th Ave., city=Paris}

Si deseamos listar todos los datos de la tabla podemos simplemente agregar el siguiente método a la interface CustomerMapper.

@Select("SELECT * FROM Customer")
List<Customer> selectAllCustomer();

Obtendríamos los datos de esta manera:

List<Customer> all = mapper.selectAllCustomer();
all.forEach(System.out::println);

El resultado sería:

Customer{id=0, firstname=Laura, lastname=Steel, street=429 Seventh Av., city=Dallas}
Customer{id=1, firstname=Robert, lastname=King, street=267 - 20th Ave., city=Seattle}
Customer{id=2, firstname=Robert, lastname=Sommer, street=22 - 20th Ave., city=Oslo}
Customer{id=3, firstname=Michael, lastname=Smith, street=455 Upland Pl., city=Lyon}
Customer{id=4, firstname=Bill, lastname=Fuller, street=363 Seventh Av., city=Oslo}
...

De un modo parecido podemos utiliza otras anotaciones para crear otros tipos de consulta como lo son Update, Delete, otras, las veremos en la próxima entrada.

Descargar código: hsqldb-mybatis.zip

Comentarios

Entradas populares de este blog

Conectar SQL Server con Java

Entrenar OpenCV en Detección de Objetos

Acceso a la webcam con OpenCV

Procesamiento de imágenes en OpenCV

Conociendo la clase cv::Mat de OpenCV