Implementing Data Queries Using MyBatis Mapper Proxy

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.

Tags: MyBatis Mapper Proxy Dynamic Proxy Data Access java

Posted on Sun, 25 Oct 2026 16:46:05 +0000 by alanrenouf