Mybatis默认情况下是不支持传入多个参数的.只能传入一个参数.
所谓的传入参数指定是Mybatis操作
(insert,delete,update,select标签)的传入参数.
方案1:将这些参数封装到一个对象里面(JavaBean/Map),再传入.
方案2:给参数设置一个@Param注解支持,而且多参数的类型要统一
方案3:使用arg0,arg1…或者param1,param2…
问题:为什么不支持多个参数?
因为Java语法1.7以前.是不能通过反射技术获得方法的参数名的.
解决方案使用 @Param 参数注解
UserMapper.java
package com.mybatis.mapper;
import java.util.Map;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import com.mybatis.pojo.User;
/*
* 使用MyBatis的动态代理开发编写代码遵循四个原则
* 1.映射文件的namespace命名空间的值必须是对应接口的全限定名
2.映射文件的对应功能 id值必须等于映射接口中方法的名称
3.映射文件的参数类型必须和接口中方法的参数类型一致
4.映射文件查询的返回结果类型必须和接口的方法的返回数据类型一致,
DML操作返回的受影响的行数,除外
*/
public interface UserMapper {
@Select("select * from user where username=#{arg0} and password=#{arg1}")
User login1(String name,String password);
@Select("select * from user where username=#{param1} and password=#{param2}")
User login2(String name,String pwd);
@Select("select * from user where username=#{name} and password=#{pwd}")
User login3(@Param("name") String name,@Param("pwd") String pwd);
@Select("select * from user where username=#{arg0} and password=#{arg1} and age=#{arg2}")
User login4(String name,String pwd,Integer age);
@Select("select * from user where username=#{username} and password=#{password}")
User login5(User user);
@Select("select * from user where username=#{name} and password=#{pwd}")
User login6(Map<String,Object> map);
//Integer[]参数必须加@Param
int deleteByIds(@Param("ids")Integer[] ids);
//List<User>参数必须加@Param
int insertByBatch(@Param("users")List<User> users);
}
测试代码
package com.mybatis.test;
import static org.junit.Assert.*;
import java.util.HashMap;
import java.util.Map;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import com.mybatis.mapper.UserMapper;
import com.mybatis.pojo.User;
import com.mybatis.util.MyBatisUtil;
public class UserMapperTest {
@Test
public void testLogin1() {
// 1.创建SqlSession操作对象
SqlSession session = MyBatisUtil.openSession();
// 2.创建UserMapper接口的代理对象
UserMapper userMapper = session.getMapper(UserMapper.class);
// 3.执行UserMapper的查询操作
User user = userMapper.login1("小龙女", "xiaolongnv");
System.out.println(user);
// 4.关闭session
session.close();
}
@Test
public void testLogin2() {
// 1.创建SqlSession操作对象
SqlSession session = MyBatisUtil.openSession();
// 2.创建UserMapper接口的代理对象
UserMapper userMapper = session.getMapper(UserMapper.class);
// 3.执行UserMapper的查询操作
User user = userMapper.login2("小龙女", "xiaolongnv");
System.out.println(user);
// 4.关闭session
session.close();
}
@Test
public void testLogin3() {
// 1.创建SqlSession操作对象
SqlSession session = MyBatisUtil.openSession();
// 2.创建UserMapper接口的代理对象
UserMapper userMapper = session.getMapper(UserMapper.class);
// 3.执行UserMapper的查询操作
User user = userMapper.login3("小龙女", "xiaolongnv");
System.out.println(user);
// 4.关闭session
session.close();
}
@Test
public void testLogin4() {
// 1.创建SqlSession操作对象
SqlSession session = MyBatisUtil.openSession();
// 2.创建UserMapper接口的代理对象
UserMapper userMapper = session.getMapper(UserMapper.class);
// 3.执行UserMapper的查询操作
User user = userMapper.login4("小龙女", "xiaolongnv",18);
System.out.println(user);
// 4.关闭session
session.close();
}
@Test
public void testLogin5() {
// 1.创建SqlSession操作对象
SqlSession session = MyBatisUtil.openSession();
// 2.创建UserMapper接口的代理对象
UserMapper userMapper = session.getMapper(UserMapper.class);
// 3.执行UserMapper的查询操作
User param=new User();
param.setUsername("小龙女");
param.setPassword("xiaolongnv");
User user = userMapper.login5(param);
System.out.println(user);
// 4.关闭session
session.close();
}
@Test
public void testLogin6() {
// 1.创建SqlSession操作对象
SqlSession session = MyBatisUtil.openSession();
// 2.创建UserMapper接口的代理对象
UserMapper userMapper = session.getMapper(UserMapper.class);
// 3.执行UserMapper的查询操作
Map<String, Object> map=new HashMap<String, Object>();
map.put("name", "小龙女");
map.put("pwd","xiaolongnv");
User user = userMapper.login6(map);
System.out.println(user);
// 4.关闭session
session.close();
}
}