1 parameterType
parameterType:接口中方法参数的类型,类型必须是完全限定名或别名(稍后讲别名)。该属性非必须,因为Mybatis框架能自行判断具体传入语句的参数,默认值为未设置(unset)。<select>,<insert>,<update>,<delete>都可以使用 parameterType 指定参数类型。
2 传递单个参数
当接口中的方法只有一个参数的时候,直接使用#{任意名称}传参即可,#{}中的名称与方法中的参数名称无关。
3 传递多个参数
当接口中方法有多个参数的时候,有以下方式传参:
3.1 通过参数下标索引
接口正常书写,映射文件中SQL语句的占位符必须用 arg0 agr1…,或param1 param2…
注意:mybatis-3.3 之前的版本使用#{0},#{1}方式, 从 mybatis3.4 开始使用#{arg0}方式。
TeamMapper接口添加如下内容:
List<Team> queryByRange1(Integer min, Integer max);
TeamMapper.xml配置文件中添加如下:
<!--多个参数:标签中不需要parameterType属性 方式1:通过下标索引的方式,还有两种方式(太难记了,可以忽略,看看演示就好啦) select * from team where teamId >=#{arg0} and teamId <=#{arg1}; 也可以,注意下表索引 细节1: mybatis3.3版本之前:可以直接写#{0} #{1} 从mybatis3.4开始:#{arg0} #{arg1}... 或者是 #{param1} #{param2}... 细节2: sql语句中不能使用小于号,使用转移符号替换;大于号没有限制,也可以使用转义符号替换> --> <select id="queryByRange1" resultType="com.lina.pojo.Team"> select * from team where teamId >=#{param1} and teamId <=#{param2}; </select>
测试类添加方法:
/** * ClassName: TestTeamMapperArg * 测试输入映射:多个参数 * @author wanglina * @version 1.0 */ public class TestTeamMapperArg { private TeamMapper teamMapper= MybatisUtil.getSqlSession().getMapper(TeamMapper.class); @Test public void test01(){ List<Team> teams = teamMapper.queryByRange1(1004, 1010); teams.forEach(team -> System.out.println(team)); } }
3.2 通过@Param注解
在方法的形参前面加入@Param("自定义参数名称"),mapper文件中使用#{自定义参数名称}的方式传参。
TeamMapper接口添加如下内容:
List<Team> queryByRange2(@Param("min") Integer min, @Param("max") Integer max);
TeamMapper.xml配置文件中添加如下:
<!--方式2:通过注解的方式: #{}中的名称必须与接口的方法中的参数注解@Param()保持一致 select * from team where teamId >=#{param1} and teamId <= #{param2}; 不推荐,但是语法也是正确的,但是不能使用arg0,arg1...... --> <select id="queryByRange2" resultType="com.lina.pojo.Team"> select * from team where teamId >=#{min} and teamId <= #{max}; </select>
测试类添加方法:
@Test public void test02(){ List<Team> teams = teamMapper.queryByRange2(1005, 1011); teams.forEach(team -> System.out.println(team)); }
3.3 通过map来传递多个参数
Map 集合可以存储多个值,使用Map向 mapper 文件一次传入多个参数。Map 集合使用 String的 key,Object 类型的值存储参数。 mapper 文件使用 # { key } 引用参数值
TeamMapper接口添加如下内容:
List<Team> queryByRange3(Map<String,Object> map);
TeamMapper.xml配置文件中添加如下:
<!--方式3:通过map来传递多个参数:映射文件中的参数占位符必须和map中的String类型的字段名称一样--> <select id="queryByRange3" resultType="com.lina.pojo.Team"> select * from team where teamId >=#{min} and teamId <= #{max}; </select>
测试类添加方法:
@Test public void test03(){ TeamMapper teamDao= sqlSession.getMapper(TeamMapper.class); Map<String, Object> map=new HashMap<>(); map.put("min",1001); map.put("max",2000); List<Team> teamList3 = teamDao.queryByRange3(map); for (Team team : teamList3) { System.out.println(team); } }
3.4 通过pojo类传递多个参数
与map传递多个参数类似,要求映射文件中的参数占位符必须和pojo类中的属性完全一致。
实体类:
/** * ClassName: QueryVO * 自己封装的查询条件 * @author wanglina * @version 1.0 */ public class QueryVO { private String name; private Integer min; private Integer max; private String location; //省略set get }
TeamMapper接口添加如下内容:
List<Team> queryByCondition(QueryVO vo);
TeamMapper.xml配置文件中添加如下:
<!--方式4:通过pojo类传递多个参数:映射文件中的参数占位符必须和pojo类中的字段完全一致--> <select id="queryByCondition" resultType="com.lina.pojo.Team"> select * from team where teamId>=#{min} and teamId<=#{max} and teamName like #{name} and location=#{location} </select>
测试类添加方法:
@Test public void test04(){ QueryVO vo=new QueryVO(); vo.setLocation("洛杉矶"); vo.setName("%球队%"); vo.setMin(1001); vo.setMax(1111); List<Team> teams = teamMapper.queryByCondition(vo); teams.forEach(team -> System.out.println(team)); }