Handling Multiple Parameter Types in MyBatis Mapper Methods

MyBatis supports various ways to pass parameters to mapper methods, depending on the type and number of arguments. Below are common scenarios with corresponding interface definitions, XML mappings, and usage patterns.

Mapper Interface

package com.msb.mapper;

import com.msb.pojo.Emp;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Map;

public interface EmpMapper {
    List<Emp> findAll();

    Emp findByEmpno(int empno);

    List<Emp> findByDeptnoAndSal(@Param("deptno") int deptno, @Param("sal") double sal);

    List<Emp> findByDeptnoAndSalUsingMap(Map<String, Object> params);

    List<Emp> findByDeptnoAndSalUsingEmp(Emp condition);

    List<Emp> findByDeptnoAndSalUsingTwoEmps(@Param("empA") Emp empA, @Param("empB") Emp empB);
}

XML Mapper Configuration

<?xml version="1.0" encoding="UTF-8" ?>
<mapper namespace="com.msb.mapper.EmpMapper">

    <select id="findAll" resultType="emp">
        SELECT * FROM emp
    </select>

    <!-- Single primitive parameter -->
    <select id="findByEmpno" resultType="emp">
        SELECT * FROM emp WHERE empno = #{empno}
    </select>

    <!-- Multiple primitives using @Param -->
    <select id="findByDeptnoAndSal" resultType="emp">
        SELECT * FROM emp WHERE deptno = #{deptno} AND sal >= #{sal}
    </select>

    <!-- Parameters passed via Map -->
    <select id="findByDeptnoAndSalUsingMap" resultType="emp" parameterType="map">
        SELECT * FROM emp WHERE deptno = #{deptno} AND sal >= #{sal}
    </select>

    <!-- Single object parameter -->
    <select id="findByDeptnoAndSalUsingEmp" resultType="emp" parameterType="emp">
        SELECT * FROM emp WHERE deptno = #{deptno} AND sal >= #{sal}
    </select>

    <!-- Two object parameters with @Param aliases -->
    <select id="findByDeptnoAndSalUsingTwoEmps" resultType="emp">
        SELECT * FROM emp WHERE deptno = #{empA.deptno} AND sal >= #{empB.sal}
    </select>
</mapper>

Usage Examples

package com.msb.testDemo;

import com.msb.mapper.EmpMapper;
import com.msb.pojo.Emp;
import com.msb.util.SqlSessionUtil;
import org.apache.ibatis.session.SqlSession;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class ParameterTest {
    public static void main(String[] args) {
        SqlSession session = SqlSessionUtil.getSqlSession(true);
        EmpMapper mapper = session.getMapper(EmpMapper.class);

        // 1. Single primitive
        Emp emp = mapper.findByEmpno(7902);
        System.out.println(emp);

        // 2. Multiple primitives with @Param
        List<Emp> list1 = mapper.findByDeptnoAndSal(10, 1500.0);
        list1.forEach(System.out::println);

        // 3. Using a Map
        Map<String, Object> params = new HashMap<>();
        params.put("deptno", 10);
        params.put("sal", 1500.0);
        List<Emp> list2 = mapper.findByDeptnoAndSalUsingMap(params);
        list2.forEach(System.out::println);

        // 4. Single object
        Emp cond = new Emp();
        cond.setDeptno(10);
        cond.setSal(1500.0);
        List<Emp> list3 = mapper.findByDeptnoAndSalUsingEmp(cond);
        list3.forEach(System.out::println);

        // 5. Two objects with @Param
        Emp empA = new Emp();
        empA.setDeptno(10);
        Emp empB = new Emp();
        empB.setSal(1500.0);
        List<Emp> list4 = mapper.findByDeptnoAndSalUsingTwoEmps(empA, empB);
        list4.forEach(System.out::println);

        session.close();
    }
}

Tags: MyBatis java Mapper parameter passing database

Posted on Mon, 20 Jul 2026 17:37:26 +0000 by bnmng