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();
}
}