使用MyBatis框架时,传递参数的种类不同,使用的方式也有所差异,单参数,多参数,对象作为参数做一个总结,例子以老生长谈的emp表为例
1.单参数-基础数据类型
查出部门编号为20的记录
EmpMapper.java
/**
* 根据部门编号查询记录
* @param deptno 部门编号
* @return list<emp>集合
*/
public List<Emp> findBydeptno(int deptno);
EmpMapper.xml
<!--
parameterType是可以不写,但是写需要与接口参数的类型相同
-->
<select id="findBydeptno" resultType="emp">
select * from emp where deptno = #{deptno}
</select>
测试类
@Test
public void Test05(){
EmpMapper mapper = session.getMapper(EmpMapper.class);
List<Emp> emps = mapper.findBydeptno(20);
emps.forEach(System.out::println);
}
2.多参数-基础数据类型
当传入两个基础数据类型
/**
* 通过部门编号deptno和奖金sal的值筛选记录
* @param deptno 部门编号
* @param sal 奖金
* @return list<emp>
* 方式一直接传入
* public List<Emp> findByDeptnoAndSal(int deptno, double sal);
* 方式二为传入的参数添加注释
* public List<Emp> findByDeptnoAndSal(@Param("deptno") int deptno, @Param("sal") double sal);
*/
public List<Emp> findByDeptnoAndSal(@Param("deptno") int deptno, @Param("sal") double sal);
EmpMapper.xml
<!--
方式一:1.通过arg来传参,arg0代表第一个参数,arg1代表第二个参数。注意在这里parameterType是不可以写的,毕竟只能写一个类型
2.通过param来传参,param1代表第一个参数,param2代表第二个参数。
方式二:因为已经对参数进行了注释,可以直接使用注释的字符串填写到#{}中
注:<的原型是<,具有其他意义所以使用html中的语法代替,也可以使用CDATA语法
-->
<select id="findByDeptnoAndSal" resultType="emp">
<!--select * from emp where deptno = #{arg0} and sal < #{arg1}-->
<!--select * from emp where deptno = #{param1} and sal < #{param2}-->
select * from emp where deptno = #{deptno} and sal < #{sal}
</select>
测试类:
@Test
public void Test02(){
EmpMapper mapper = session.getMapper(EmpMapper.class);
List<Emp> emps = mapper.findByDeptnoAndSal(20, 3000.0);
emps.forEach(System.out::println);
}
3.多参数-通过map类型传参
将需要传递的参数放入map中传递
EmpMapper.java
/**
* 将部门编号和奖金放入一个map中进行传递
*
* @param map map类型的参数
* @return list集合
*/
public List<Emp> findByMap(Map<String,Object> map);
EmpMapper.xml
<!--
parameterType 全路径本应写成java.util.Map 但mybatis做了别名,可以使用小写map进行填写
-->
<select id="findByMap" resultType="emp" parameterType="map">
select * from emp where deptno = #{deptno} and sal < #{sal}
</select>
测试代码:
@Test
public void Test03(){
EmpMapper mapper = session.getMapper(EmpMapper.class);
Map<String,Object> map = new HashMap<>();
map.put("deptno",20);
map.put("sal",3000.0);
List<Emp> emps = mapper.findByMap(map);
emps.forEach(System.out::println);
}
4.多参数-通过实体类传递参数
创建一个emp对象,通过emp对象传递
EmpMapper.java
/**
* 将部门编号和奖金放入一个emp对象中传递
* @param emp 对象
* @return
*/
public List<Emp> findByEmp(Emp emp);
EmpMapper.xml
<!--
Emp类在核心配置文件中有配置typeAlises,parameterType可以使用类名的小写类名就可
参数名称会根据emp的属性自动解析
-->
<select id="findByEmp" parameterType="emp" resultType="emp">
select * from emp where deptno = #{dept.deptno} and sal < #{sal}
</select>