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();
}
}