Introdução
Neste projeto, você aprenderá como usar o MyBatis, um popular framework de persistência Java, para interagir com um banco de dados MySQL. Especificamente, você aprenderá como usar parâmetros de entrada em consultas SQL e recuperar informações de cursos com base no nome do professor.
👀 Pré-visualização
[labex] DEBUG [main] - Setting autocommit to false on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@642a7222]
[labex] DEBUG [main] - ==> Preparing: SELECT * FROM course WHERE teacher LIKE CONCAT('%', ?, '%') ORDER BY cNo DESC
[labex] DEBUG [main] - ==> Parameters: Am(String)
[labex] DEBUG [main] - <== Total: 2
Course Number: 3 Course Name: Python Teacher: Liam
Course Number: 1 Course Name: HTML Teacher: Amy
🎯 Tarefas
Neste projeto, você aprenderá:
- Implementar a interface
CourseMapperpara definir um método para recuperar cursos com base no nome do professor - Escrever a consulta SQL no arquivo
CourseMapper.xmlpara realizar uma busca difusa (fuzzy search) na colunateachere ordenar os resultados em ordem decrescente pelo número do curso - Testar a implementação do
CourseMapperna classeMyBatisTestpara garantir a funcionalidade desejada
🏆 Conquistas
Após concluir este projeto, você será capaz de:
- Usar o MyBatis para interagir com um banco de dados MySQL
- Passar parâmetros de entrada para consultas SQL usando um
Map - Realizar uma busca difusa (fuzzy search) em uma coluna do banco de dados e ordenar os resultados
- Testar a funcionalidade de um mapper MyBatis usando um caso de teste JUnit
Implementar a Interface CourseMapper
Nesta etapa, você implementará a interface CourseMapper para recuperar informações do curso com base no nome do professor.
- Abra o arquivo
CourseMapper.javalocalizado no pacoteorg.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);
}
A interface CourseMapper define um método getCoursesByTeacherName que recebe um Map como parâmetro de entrada. Este método será usado para recuperar cursos onde o nome do professor contém o valor especificado.
Implementar a Consulta SQL no Arquivo Mapper XML
Nesta etapa, você implementará a consulta SQL no arquivo CourseMapper.xml para recuperar os cursos com base no nome do professor.
- Abra o arquivo
CourseMapper.xmllocalizado no diretóriosrc/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>
O elemento <select> define a consulta SQL que será executada quando o método getCoursesByTeacherName for chamado. O atributo parameterType especifica que o parâmetro de entrada é um HashMap, e o atributo resultType especifica que o resultado será mapeado para a classe Course.
A consulta SQL usa o operador LIKE com a função CONCAT para realizar uma busca difusa (fuzzy search) na coluna teacher, onde o nome do professor contém o valor teacherName especificado. Os resultados são então ordenados em ordem decrescente pela coluna cNo (número do curso).
Testar o CourseMapper na Classe MyBatisTest
Nesta etapa, você testará a implementação do CourseMapper criando um caso de teste no arquivo MyBatisTest.java.
- Abra o arquivo
MyBatisTest.javalocalizado no pacoteorg.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";
//Load the MyBatis configuration file
Reader reader = Resources.getResourceAsReader(resource);
//Create the SqlSession factory
sessionFactory = new SqlSessionFactoryBuilder().build(reader);
//Create a SqlSession object that can execute SQL statements in the SQL mapping file
session = sessionFactory.openSession();
}
@Test
public void testCourseMapper() {
CourseMapper courseMapper = session.getMapper(CourseMapper.class);
// Create a parameter map
Map<String, Object> param = new HashMap<>();
param.put("teacherName", "Am");
// Call the method defined in CourseMapper
List<Course> courses = courseMapper.getCoursesByTeacherName(param);
for (Course course : courses) {
System.out.println(course);
}
}
@After
public void after() {
session.close();
}
}
No método testCourseMapper, primeiro obtemos uma instância da interface CourseMapper usando session.getMapper(CourseMapper.class). Em seguida, criamos um HashMap como o parâmetro de entrada e colocamos a chave "teacherName" com o valor "Am".
Finalmente, chamamos o método getCoursesByTeacherName do CourseMapper e imprimimos os objetos Course recuperados.
Executar o Caso de Teste
Para executar o caso de teste, siga estes passos:
- No seu terminal, use o seguinte comando para iniciar o banco de dados MySQL e importar o arquivo
course.sql:
sudo service mysql start
mysql -u root < course.sql
- Navegue até o diretório do projeto
MyBatisCourseDemousando o seguinte comando:
cd ~/project/MyBatisCourseDemo/
- Execute o seguinte comando para executar o caso de teste:
mvn test
A saída deve ser semelhante à seguinte:
[labex] DEBUG [main] - Setting autocommit to false on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@642a7222]
[labex] DEBUG [main] - ==> Preparing: SELECT * FROM course WHERE teacher LIKE CONCAT('%', ?, '%') ORDER BY cNo DESC
[labex] DEBUG [main] - ==> Parameters: Am(String)
[labex] DEBUG [main] - <== Total: 2
Course Number: 3 Course Name: Python Teacher: Liam
Course Number: 1 Course Name: HTML Teacher: Amy
Isso mostra que o método getCoursesByTeacherName no CourseMapper está funcionando conforme o esperado, recuperando os cursos onde o nome do professor contém "Am" e ordenando-os em ordem decrescente pelo número do curso.
Resumo
Parabéns! Você concluiu este projeto. Você pode praticar mais laboratórios no LabEx para aprimorar suas habilidades.



