MyBatis之参数传递
在mybatis中进行参数传递时,在最底层的源码中都会创建一个Map类对参数进行参数封装,例如在对多个参数进行传递时,
package com.itheima.pojo;
public class User {
private Integer id;
private String username;
private String password;
private String gender;
private String addr;
public void setId(Integer id) {
this.id = id;
}
public void setUsername(String username) {
this.username = username;
}
public void setPassword(String password) {
this.password = password;
}
public void setGender(String gender) {
this.gender = gender;
}
public void setAddr(String addr) {
this.addr = addr;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
", gender='" + gender + '\'' +
", addr='" + addr + '\'' +
'}';
}
}
<select id="select" resultType="com.itheima.pojo.User">
select *
from tb_User
where
username=#{username}
and password=#{password}
</select>
如上面代码,在我们进行多参数传递时,此时在底层代码运行中会先创造一个map类对其进行封装,传递参数中的,参数一(username)所对应的参数名为arg0或param1,代表着我们此时在sql语句中可以通过arg0或param1知道的我们实际想要的参数(username)
package com.itheima;
import com.itheima.mapper.BrandMapper;
import com.itheima.mapper.UserMapper;
import com.itheima.pojo.Brand;
import com.itheima.pojo.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class UserMappTest {
@Test
public void testSelect() throws IOException {
String username="zhangsan";
String password="123";
//1.加载mybatis的核心配置文件,获取SqlSessionFactory
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//2.获取SqlSession对象,用它来执行sql
SqlSession sqlSession=sqlSessionFactory.openSession();
// //3.执行sqL
// List<User> users=sqlSession.selectList("test.selectAll");
//3.1 获取UserMapper接口的代理对象
UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
User user=userMapper.select(username,password);
System.out.println(user);
//4.释放资源
sqlSession.close();
}
}
如我下面对代码如果没有对相应参数进行@param注解,因为传递的参数username在map封装类中的所对应的参数名为arg0或param1,所当我在sql语句username=#{username}中想要通过键名#{username}找到相应的username值是找不到的会有以下报错
现在我对代码进行改编
<select id="select" resultType="com.itheima.pojo.User">
select *
from tb_User
where
username=#{arg0}
and password=#{arg1}
</select>
结果如下
但是在实际中如果,这样的键名使用起来并不是很方便,因此我们进行@param注释
User select(@Param("username") String username, @Param("password") String password);
运行结果如下:
此时可以知道map封装类中对应于password和username的键名因为@param注释进行了改编,当然此时也要改变sql语句中的键名
运行结果如下
很nice!!!
这样就可以让代码变得简洁易懂
一下时MyBatis对不同参数进行参数封装的键名
MyBatis 参数封装:
- 单个参数:
1.POJ0类型:直接使用,属性名和参数占位符名称一致
2.Map集合:直接使用,键名和参数占位符名称一致
3.Collection:封装为Map集合,可以使用@Param注解,替换Map集合中默认的arg键名
map.put("arg",collection集合);
map.put("collection",collection集合);
4.List:封装为Map集合,可以使用@Param注解,替换Map集合中默认的arg键名
map.put("arg0"list集合);
map.put("collection",list集合);map.put("list"list集合);
5.Array:封装为Map集合,可以使用Param注解,替换Map集合中默认的arg键名
map.put("arg"数组);
map.put("array",数组);
6.其他类型:直接使用
- 多个参数:封装为Map集合,可以使用@Param注解,替换Map集合中默认的arg键名
map.put("arg0",参数值1)
map.put("param1",参数值1)
map.put("param2",参数值2)
map.put("agr1",参数值2)
------@Param("username")
map.put("username",参数值1)
map.put("param1",参数值1)
map.put("param2",参数值2)
map.put("agr1",参数值2)