传递单个参数的形式
MyBatis
会自动进行参数的赋值
<select id="findUserById" resultType="user" parameter="int">
<!--这里的#{id}里面的参数可以随便写,只起占位符的作用-->
select * from user where id=#{id}
</select>
传递多个参数
- 直接使用参数传递
Mybatis
会把这些参数自动封装在Map
集合中,可以在xml
映射文件中通过#{key}
来获得对应的参数值
/*在UserDao.java中*/
User findUserByNameAndSex(String username, String sex)
<!--在UserDao.xml中-->
<select id="findUserByNameAndSex" resultType="user">
select * from user where username=#{arg0} and sex=#{arg1}
或者 select * from user where username=#{param1} and sex=#{param2}
</select>
/*测试*/
@Test
public void testFindUserByNameAndSex(){
User user = userDao.findUserByNameAndSex("李四","男");
System.out.println(user);
}
如果没有显示的指定参数存进Map
集合中的Key
值,系统会默认设置为(arg0
,agr1
,age2
…)或者(param1
,param2
,param3
…)
我们也可以使用注解来指定Key
/*在UserDao.java中*/
User findUserByNameAndSex(@Param("username")String username,@Param("sex") String sex)
<!--在UserDao.xml中-->
<select id="findUserByNameAndSex" resultType="user">
select * from user where username=#{username} and sex=#{sex}
</select>
/*测试*/
@Test
public void testFindUserByNameAndSex(){
User user = userDao.findUserByNameAndSex("李四","男");
System.out.println(user);
}
- 手动把多个参数封装在Map中传递
/*在UserDao.java中*/
User findUserByNameAndSex(Map<String ,String> map);
<!--在UserDao.xml中-->
<select id="findUserByNameAndSex" resultType="user">
select * from user where username=#{username} and sex=#{sex}
</select>
/*测试*/
@Test
public void testFindUserByNameAndSex(){
Map<String, String> map = new HashMap<>();
map.put("username", "李四");
map.put("sex", "男");
User user = userDao.findUserByNameAndSex(map);
System.out.println(user);
}
-
使用
JavaBean
传递参数把多个参数封装到
JavaBean
中传递,在xml
中利用OGNL
来获取参数#{username} 等同于调用实例对象的getUsername()方法获得值
-
多参数传递总结
- 使用
map
传递参数,业务可读性差 @Param
注解,受到参数个数n
的影响,建议n<5
时使用- 以上参数的处理各有利弊,参数
n>5
,建议用JavaBean
封装的方法
- 使用
集合和数组类型参数的处理
-
当参数为
Collection
接口时,转换为Map
,Map
的Key
为collection
(用#{collection}
获取该集合,用#{collection[0]}
获取集合中第一个元素的值) -
如果参数的类型为
List
接口,除了用Key=collection
可以获取该List
外,还可以用Key=list
(可以用#{collection}
或者#{list}
获取该集合,用#{collection[0]}
或#{list[0]}
获取集合中第一个元素的值) -
如果参数为数组,也会转换为
Map
,Map
的Key
为array
(用#{array}
获取该数组,用#{array[0]}
获取数组中第一个元素的值)
如果我们不想使用默认的key
来获取集合,可以用@Param
注解自定义
User findUserById(@Param("userid")List<Integer> ids);
<select id="findUserById" resultMap="userMap">
select * from user where id=#{userid[0]}
</select>