Introducción
En este proyecto, aprenderá a usar MyBatis, un popular marco de persistencia Java, para interactuar con una base de datos MySQL. Específicamente, aprenderá a usar parámetros de entrada en consultas SQL y recuperar información de cursos basada en el nombre del profesor.
👀 Vista previa
[labex] DEBUG [main] - Estableciendo autocommit en falso en la conexión JDBC [com.mysql.cj.jdbc.ConnectionImpl@642a7222]
[labex] DEBUG [main] - ==> Preparando: SELECT * FROM course WHERE teacher LIKE CONCAT('%',?, '%') ORDER BY cNo DESC
[labex] DEBUG [main] - ==> Parámetros: Am(String)
[labex] DEBUG [main] - <== Total: 2
Número de curso: 3 Nombre del curso: Python Profesor: Liam
Número de curso: 1 Nombre del curso: HTML Profesor: Amy
🎯 Tareas
En este proyecto, aprenderá:
- Implementar la interfaz
CourseMapperpara definir un método para recuperar cursos basados en el nombre del profesor - Escribir la consulta SQL en el archivo
CourseMapper.xmlpara realizar una búsqueda difusa en la columnateachery ordenar los resultados en orden descendente por número de curso - Probar la implementación de
CourseMapperen la claseMyBatisTestpara asegurar la funcionalidad deseada
🏆 Logros
Después de completar este proyecto, podrá:
- Usar MyBatis para interactuar con una base de datos MySQL
- Pasar parámetros de entrada a consultas SQL usando un
Map - Realizar una búsqueda difusa en una columna de base de datos y ordenar los resultados
- Probar la funcionalidad de un mapper de MyBatis usando un caso de prueba JUnit
Implementar la interfaz CourseMapper
En este paso, implementará la interfaz CourseMapper para recuperar información de cursos basada en el nombre del profesor.
- Abra el archivo
CourseMapper.javaubicado en el paqueteorg.labex.mapper.
package org.labex.mapper;
import java.util.List;
import java.util.Map;
import org.labex.pojo.Course;
public interface CourseMapper {
List<Course> getCoursesByTeacherName(Map<String, Object> params);
}
La interfaz CourseMapper define un método getCoursesByTeacherName que toma un Map como parámetro de entrada. Este método se utilizará para recuperar cursos donde el nombre del profesor contenga el valor especificado.
Implementar la consulta SQL en el archivo Mapper XML
En este paso, implementará la consulta SQL en el archivo CourseMapper.xml para recuperar los cursos basados en el nombre del profesor.
- Abra el archivo
CourseMapper.xmlubicado en el directoriosrc/main/java/org/labex/mapper.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.labex.mapper.CourseMapper">
<select id="getCoursesByTeacherName" parameterType="java.util.HashMap" resultType="org.labex.pojo.Course">
SELECT * FROM course
WHERE teacher LIKE CONCAT('%', #{teacherName}, '%')
ORDER BY cNo DESC
</select>
</mapper>
El elemento <select> define la consulta SQL que se ejecutará cuando se llame al método getCoursesByTeacherName. El atributo parameterType especifica que el parámetro de entrada es un HashMap, y el atributo resultType especifica que el resultado se mapeará a la clase Course.
La consulta SQL utiliza el operador LIKE con la función CONCAT para realizar una búsqueda difusa en la columna teacher, donde el nombre del profesor contiene el valor especificado teacherName. Los resultados se ordenan luego en orden descendente por la columna cNo (número de curso).
Probar CourseMapper en la clase MyBatisTest
En este paso, probará la implementación de CourseMapper creando un caso de prueba en el archivo MyBatisTest.java.
- Abra el archivo
MyBatisTest.javaubicado en el paqueteorg.labex.test.
package org.labex.test;
import java.io.IOException;
import java.io.Reader;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.labex.mapper.CourseMapper;
import org.labex.pojo.Course;
public class MyBatisTest {
SqlSessionFactory sessionFactory = null;
SqlSession session = null;
@Before
public void before() throws IOException{
String resource = "mybatis-config.xml";
//Cargar el archivo de configuración de MyBatis
Reader reader = Resources.getResourceAsReader(resource);
//Crear la fábrica de SqlSession
sessionFactory = new SqlSessionFactoryBuilder().build(reader);
//Crear un objeto SqlSession que puede ejecutar instrucciones SQL en el archivo de mapeo SQL
session = sessionFactory.openSession();
}
@Test
public void testCourseMapper() {
CourseMapper courseMapper = session.getMapper(CourseMapper.class);
// Crear un mapa de parámetros
Map<String, Object> param = new HashMap<>();
param.put("teacherName", "Am");
// Llamar al método definido en CourseMapper
List<Course> courses = courseMapper.getCoursesByTeacherName(param);
for (Course course : courses) {
System.out.println(course);
}
}
@After
public void after() {
session.close();
}
}
En el método testCourseMapper, primero obtenemos una instancia de la interfaz CourseMapper usando session.getMapper(CourseMapper.class). Luego, creamos un HashMap como parámetro de entrada y ponemos la clave "teacherName" con el valor "Am".
Finalmente, llamamos al método getCoursesByTeacherName de CourseMapper e imprimimos los objetos Course recuperados.
Ejecutar el caso de prueba
Para ejecutar el caso de prueba, siga estos pasos:
- En su terminal, use el siguiente comando para iniciar la base de datos MySQL e importar el archivo
course.sql:
sudo service mysql start
mysql -u root < course.sql
- Navegue hasta el directorio del proyecto
MyBatisCourseDemousando el siguiente comando:
cd ~/project/MyBatisCourseDemo/
- Ejecute el siguiente comando para ejecutar el caso de prueba:
mvn test
La salida debe ser similar a la siguiente:
[labex] DEBUG [main] - Estableciendo autocommit en falso en la conexión JDBC [com.mysql.cj.jdbc.ConnectionImpl@642a7222]
[labex] DEBUG [main] - ==> Preparando: SELECT * FROM course WHERE teacher LIKE CONCAT('%',?, '%') ORDER BY cNo DESC
[labex] DEBUG [main] - ==> Parámetros: Am(String)
[labex] DEBUG [main] - <== Total: 2
Número de curso: 3 Nombre del curso: Python Profesor: Liam
Número de curso: 1 Nombre del curso: HTML Profesor: Amy
Esto muestra que el método getCoursesByTeacherName en el CourseMapper está funcionando como se esperaba, recuperando los cursos donde el nombre del profesor contiene "Am" y ordenándolos en orden descendente por número de curso.
Resumen
¡Felicitaciones! Has completado este proyecto. Puedes practicar más laboratorios en LabEx para mejorar tus habilidades.



