Define an interface that declares the query method.
package com.example.mapper;
import com.example.model.Employee;
import java.util.Collection;
public interface EmployeeMapper {
Collection<Employee> retrieveAllEmployees();
}
Create a XML mapping file that links the interface method to an SQL statement.
<?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="com.example.mapper.EmployeeMapper">
<select id="retrieveAllEmployees" resultType="employee">
SELECT id, name, department, salary FROM employees
</select>
</mapper>
Configure MyBatis to scan for mapper interfaces in the main configuration file.
<mappers>
<mapper class="com.example.mapper.EmployeeMapper"/>
</mappers>
Write a test to execute the query using the mapper proxy.
package com.example.test;
import com.example.mapper.EmployeeMapper;
import com.example.model.Employee;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.*;
import java.io.Reader;
import java.util.List;
public class EmployeeQueryTest {
private SqlSession session;
@Before
public void setup() throws Exception {
try (Reader configReader = Resources.getResourceAsReader("mybatis-config.xml")) {
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(configReader);
session = factory.openSession();
}
}
@Test
public void testRetrieveAllEmployees() {
EmployeeMapper mapper = session.getMapper(EmployeeMapper.class);
List<Employee> employees = mapper.retrieveAllEmployees();
employees.forEach(emp -> System.out.println(emp.toString()));
}
@After
public void cleanup() {
if (session != null) {
session.close();
}
}
}
MyBatis employs dynamic proxy generation to create a concrete implementation of the mapper interface at runtime. The getMapper method returns a proxy object that intercepts method calls, maps them to corresponding SQL statements defined in the XML, and executes the database operations. This eliminates the need for manually coding implementation classes.