1. 传单个参数时
直接在sql语句中使用参数名字,其他的名字也是可以的
因为在处理单个参数时,mybatis是不会做特殊处理的。
看看具体的使用:
接口中的方法:
List<user>selectAll2(Integer id);
mapper文件:
<select id="selectAll2" resultType="cn.com.Ycy.mybatis.domain.user">
select * from user where id =#{id};
</select>
在测试中:
@Test
public void testSelectAll2(){
SqlSession sqlSession = mybatisUtils.getSqlSession();
userDao user = sqlSession.getMapper(userDao.class);
List<user> userList = user.selectAll2(50);
for(user users: userList){
System.out.println(users);
}
sqlSession.close();
}
2. 传多个参数时
多个参数:mybatis会做特殊处理
什么特殊处理? 就是多个参数会被封装成一个map,
这个map的key是param1、param2、param3…paramN。
这个对应的key的value就是传入的参数值
使用@Param
当dao接口中的方法有多个参数时,需要通过名称使用参数。
在方法的形参前面加入@Param(“自定义参数名称”),mapper文件中使用#{自定义名称}
例如:
接口中的方法:
List<user>selectAll2(@Param("min")Integer min, @Param("max") Integer max);
mapper文件:
<select id="selectAll2" resultType="cn.com.Ycy.mybatis.domain.user">
select * from user where id between #{min} and #{max};
</select>
使用对象
使用Java对象属性值,作为参数的实际值
使用对象的语法:
#{属性名,javaType=类型名称,jdbcType=类型名称}
javaType是指Java中的属性数据类型
jdbcType是指数据库中的数据类型
例如:
#{username,javaType=java.lang.String,jdbcType=VARCHAR}
比较少用,就不多介绍
上面的简化版的格式: #{属性名} 直截了当
javaType 和 jdbcType 的值mybatis会反射获取
说说具体使用
在接口中的方法:
List<user>selectAll3(user user);
在mapper中:
<select id="selectAll3" resultType="cn.com.Ycy.mybatis.domain.user">
select * from user where id =#{id} or username=#{username};
</select>
在测试类中
@Test
public void testSelectAll3(){
SqlSession sqlSession = mybatisUtils.getSqlSession();
userDao user = sqlSession.getMapper(userDao.class);
user user1 = new user();
user1.setId(1);
user1.setUsername("张三");
List<user> userList = user.selectAll3(user1);
for(user users: userList){
System.out.println(users);
}
sqlSession.close();
}
- 按位置
参数位置是从0开始,引用语法#{0},#{1}…
在接口中:
//按位置
List<user>selectAll4(Integer min, Integer max);
在mapper文件:
<select id="selectAll4" resultType="cn.com.Ycy.mybatis.domain.user">
select * from user where id between #{0} and #{1};
</select>
在测试类中:
@Test
public void testSelectAll4(){
SqlSession sqlSession = mybatisUtils.getSqlSession();
userDao user = sqlSession.getMapper(userDao.class);
List<user> userList = user.selectAll2(50,100);
for(user users: userList){
System.out.println(users);
}
sqlSession.close();
}
- Map存放多个值
Map集合是可以存储多个值的,使用Map向文件mapper一次性传入多个参数。
Map集合使用key,Object类型的值存储参数
mapper文件中使用#{key}使用参数的值
在接口中:
//Map的存储
List<user>selectAll5(Map<String,Object>map);
在mapper文件:
<select id="selectAll5" resultType="cn.com.Ycy.mybatis.domain.user">
select * from user where id =#{Map_id} or username=#{Map_username};
</select>
Map_id、Map_username都是map中的key。
在测试类中:
//Map的存储使用
@Test
public void testSelectAll5(){
SqlSession sqlSession = mybatisUtils.getSqlSession();
userDao user = sqlSession.getMapper(userDao.class);
Map<String,Object>datas = new HashMap<>();
datas.put("Map_id",29);
datas.put("Map_username","老王");
List<user> userList = user.selectAll5(datas);
for(user users: userList){
System.out.println(users);
}
sqlSession.close();
}
在实际使用的过程中,我们一般使用比较多的是@Param 和对象传入参数,其他的使用不是非常多
参数封装扩展
例如接口中的三个方法:
public Employee getEmp(@Param("id")Integer id,String lastname);
在xml取值:id===> #{id}或者#{param1} lastname ===>#{param2}
public Employee getEmployee(Integer id,@Param("e")Employee emp);
在xml中取值:id===> #{param1} lastname ===> #{e.lastname} 或者是 #{param2.lastname}
下面的需要特别注意:
public Employee getEmpById(List<Integer> id);
在xml取值:取出第一个id值===》#{list[0]}
如果是Collection(List、Set)类型或者数组,mybatis也会特殊处理,也是把传入的list或者数组封装在map中
key:可以使用collection(Collection),如果是List还可以使用这个key(list)
对于数组可以使用key(array)