Configuración de MyBatis para SQL dinámico con sentencias condicionales

Para este ejemplo, se crea una tabla llamada articulos en la base de datos.


CREATE TABLE `articulos`(
`identificador` VARCHAR(50) NOT NULL COMMENT 'ID del artículo',
`titulo` VARCHAR(100) NOT NULL COMMENT 'Título del artículo',
`escritor` VARCHAR(30) NOT NULL COMMENT 'Autor del artículo',
`fecha_publicacion` DATETIME NOT NULL COMMENT 'Fecha de publicación',
`lecturas` INT(30) NOT NULL COMMENT 'Contador de lecturas'
)ENGINE=INNODB DEFAULT CHARSET=utf8

Archivo de configuración Maven (pom.xml)


<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>Proyecto-MyBatis</artifactId>
        <groupId>org.ejemplo</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>Modulo-SQL-Dinamico</artifactId>
    <dependencies>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.24</version>
        </dependency>
    </dependencies>
    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>
</project>

Archivo de cnofiguración de MyBatis (mybatis-config.xml)


<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
    <properties resource="db.properties"></properties>
    <settings>
        <setting name="mapUnderscoreToCamelCase" value="true" />
    </settings>
    <typeAliases>
        <package name="org.ejemplo.modelo" />
    </typeAliases>
    <environments default="desarrollo">
        <environment id="desarrollo">
            <transactionManager type="JDBC" />
            <dataSource type="POOLED">
                <property name="driver" value="${conductor}" />
                <property name="url" value="${enlace}" />
                <property name="username" value="${usuario}" />
                <property name="password" value="${contrasena}" />
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <package name="org.ejemplo.dao" />
    </mappers>
</configuration>

Clase de modelo ArticuloBlog.java


package org.ejemplo.modelo;

import java.util.Date;

import lombok.Data;

@Data
public class ArticuloBlog {
    private String identificador;
    private String titulo;
    private String escritor;
    private Date fechaPublicacion;
    private int lecturas;
}

Utilidad para ganeración de IDs (GeneradorId.java)


package org.ejemplo.util;

import java.util.UUID;

public class GeneradorId {
    public static String crearId() {
        return UUID.randomUUID().toString().replace("-", "");
    }
}

Uitlidad de sesión de MyBatis (UtilSesionMyBatis.java)


package org.ejemplo.util;

import java.io.IOException;
import java.io.InputStream;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

public class UtilSesionMyBatis {
    private static SqlSessionFactory fabricaSesiones;

    static {
        try {
            String recurso = "mybatis-config.xml";
            InputStream flujoEntrada = Resources.getResourceAsStream(recurso);
            fabricaSesiones = new SqlSessionFactoryBuilder().build(flujoEntrada);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static SqlSession obtenerSesion() {
        return fabricaSesiones.openSession(true);
    }
}

Interfaz del mapper MapperBlog.java


package org.ejemplo.dao;

import java.util.List;

import org.apache.ibatis.annotations.Param;

import org.ejemplo.modelo.ArticuloBlog;

public interface MapperBlog {
    void insertarArticulo(ArticuloBlog articulo);

    List<ArticuloBlog> buscarPorTituloOEscritor(@Param("titulo") String titulo, @Param("escritor") String escritor);
}

Archivo XML del mapper (MapperBlog.xml)


<?xml version="1.0" encoding="UTF-8" ?>
<mapper namespace="org.ejemplo.dao.MapperBlog">
    <insert id="insertarArticulo" parameterType="org.ejemplo.modelo.ArticuloBlog">
        INSERT INTO articulos (identificador, titulo, escritor, fecha_publicacion, lecturas)
        VALUES (#{identificador}, #{titulo}, #{escritor}, #{fechaPublicacion}, #{lecturas})
    </insert>

    <select id="buscarPorTituloOEscritor" resultType="ArticuloBlog">
        SELECT * FROM articulos
        <where>
            <if test="titulo != null">
                AND titulo = #{titulo}
            </if>
            <if test="escritor != null">
                AND escritor = #{escritor}
            </if>
        </where>
    </select>
</mapper>

Clase de prueba PruebaSQLDinamico.java


import java.util.Date;
import java.util.List;

import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import org.ejemplo.dao.MapperBlog;
import org.ejemplo.modelo.ArticuloBlog;
import org.ejemplo.util.GeneradorId;
import org.ejemplo.util.UtilSesionMyBatis;

public class PruebaSQLDinamico {
    @Test
    public void probarInsercion() {
        SqlSession sesion = UtilSesionMyBatis.obtenerSesion();
        MapperBlog mapper = sesion.getMapper(MapperBlog.class);
        ArticuloBlog articulo = new ArticuloBlog();
        articulo.setIdentificador(GeneradorId.crearId());
        articulo.setTitulo("Introduccion a MyBatis");
        articulo.setEscritor("AutorEjemplo");
        articulo.setFechaPublicacion(new Date());
        articulo.setLecturas(1500);

        mapper.insertarArticulo(articulo);

        articulo.setIdentificador(GeneradorId.crearId());
        articulo.setTitulo("Avanzado en Java");
        mapper.insertarArticulo(articulo);

        sesion.close();
    }

    @Test
    public void probarBusquedaCondicional() {
        SqlSession sesion = UtilSesionMyBatis.obtenerSesion();
        MapperBlog mapper = sesion.getMapper(MapperBlog.class);
        List<ArticuloBlog> resultados = mapper.buscarPorTituloOEscritor(null, "AutorEjemplo");
        for (ArticuloBlog item : resultados) {
            System.out.println(item);
        }
        sesion.close();
    }
}

Etiquetas: MyBatis SQL Dinámico sentencia if java maven

Publicado el 7-28 20:54