目录
1.单个字面量类型的参数
2.多个字面量类型的参数
3.map集合类型的参数
4.实体类类型的参数
5.使用@Param标识参数
MyBatis获取参数值的两种方式:${}和#{}
${}的本质就是字符串拼接,#{}的本质就是占位符赋值 ${}使用字符串拼接的方式拼接sql,若为字符串类型或日期类型的字段进行赋值时,需要手动加单引号;
但是#{}使用占位符赋值的方式拼接sql,此时为字符串类型或日期类型的字段进行赋值时,可以自动添加单引号
我们来创建一个应用实例:
public class User {
private Integer id;
private String username;
private String password;
private Integer age;
private String gender;
private String email;
public User() {
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
", age=" + age +
", gender='" + gender + '\'' +
", email='" + email + '\'' +
'}';
}
}
public interface UserMapper {
/**
* 根据用户名查询用户信息
* @param username
* @return
*/
User getUserByUsername(String username);
}
核心配置文件:mybatis-config.xml
若mapper接口中的方法参数为单个的字面量类型 此时可以使用${}和#{}以任意的名称获取参数的值,注意${}需要手动加单引号
比如刚刚我们写的案例,根据用户名查询用户信息,它的参数就是单个的字符串类型,那么我们在映射文件中可以这么写。
然后我们进行测试
@Test
public void testGetUserByUsername(){
SqlSession sqlSession = SqlSessionUtil.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = mapper.getUserByUsername("admin");
System.out.println(user);
}
我们可以看看sql语句,我们自己写的是#{},但是结果却变成了问号,所以说我们使用#{}的时候,在底层#{}会直接被当做占位符来解析。
但是当我们把#{}里的内容改一下
会发现这里面的值随便写,都没有问题,其实参数里的username,把这个数据真正传输到映射文件的时候,在mybatis执行sql语句的底层代码里,根本不知道参数名叫什么,只知道我们传过来的值是admin,并不知道我们传过来的参数名叫username,我们在#{}这个地方可以用任意内容获取当前参数值,但是建议我们写的有意义些。
那么我们用${}的时候,会报错。
若mapper接口中的方法参数为多个时
此时MyBatis会自动将这些参数放在一个map集合中,
以arg0,arg1...为键,以参数为值;
以 param1,param2...为键,以参数为值;
因此只需要通过${}和#{}访问map集合的键就可以获取相 对应的 值,
注意${}需要手动加单引号
此时我们根据用户名和密码两个参数才查询信息。
/**
* 验证登陆
* @param username
* @param password
* @return
*/
User checkLogin(String username,String password);
这里我们来验证一下,一个参数是这种写法,那么两个参数也用这种写法试试
@Test
public void testCheckLogin(){
SqlSession sqlSession = SqlSessionUtil.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = mapper.checkLogin("admin","123456");
System.out.println(user);
}
这里就会发现报错
这里报错意思就是:解析配置文件的时候错误,绑定参数的时候出现异常,参数username没有找到。
那么我们应该这么解决:
还有一种解决方式:
那么这是为什么呢??
如果我们当前的参数有2个,这个时候MyBatis会自动把这两个参数放在一个Map集合中,然后放在Map集合中,会以两种方式存储数据
第一种方式arg0,arg1的方式,以arg0,arg1为键,以参数值为值。
第二种方式param1,param2的方式,以param1,param2为键,以参数值为值
若mapper接口中的方法需要的参数为多个时,此时可以手动创建map集合,将这些数据放在map中
只需要通过${}和#{}访问map集合的键就可以获取相对应的值,注意${}需要手动加单引号
在Mybatis中,会把多个参数放在map集合中,那放在map集合里,还要以它设置的键进行访问,那我们现在自己把这些数据放在map里,然后我们就以自己设置的键来访问。
/**
* 验证登陆(以map集合作为参数)
* @param map
* @return
*/
User checkLoginByMap(Map map);
比如说map集合里存储的是用户名和密码,用户名的键是username,密码的键是password
@Test
public void testCheckLoginByMap(){
SqlSession sqlSession = SqlSessionUtil.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
Map map = new HashMap<>();
map.put("username","admin");
map.put("password","123456");
User user = mapper.checkLoginByMap(map);
System.out.println(user);
}
这种情况就是自定义一下了,如果我们有多个参数,让mybatis自动放入map集合里,还需要以它的键进行访问,那么我们现在手动放map里,我们就可以以自己定义的键,来访问数据了。
UserMapper.xml
这是我们自己设置的map集合中的键,访问到了相应的数据。但是还需要自己把这些数据手动放到map集合中。
若mapper接口中的方法参数为实体类对象时
此时可以使用${}和#{},通过访问实体类对象中的属性名获取属性值,注意${}需要手动加单引号
现在是第四种情况,比如说我们现在实现添加用户信息功能,我们一开始需要在页面收集用户输入的内容,然后把这些内容提交到服务器中,获取完之后,需要封装到User对象里,这个时候做的就是传到Service,Service则是调用Mapper接口,而Mapper接口中的参数就应该是User对象,也就是一个实体类类型的参数,那我们现在要做的就是把实体类中各个属性的值拼接到SQL语句中,来实现一个添加语句的功能。
/**
* 添加用户信息
* @param user
*/
void insertUser(User user);
insert into t_user values(null,#{username},#{password},#{age},#{gender},#{email})
@Test
public void testinsertUser(){
SqlSession sqlSession = SqlSessionUtil.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = new User(null,"root","123456",33,"女","[email protected]");
mapper.insertUser(user);
}
我们还是以登陆功能为例。
我们之前在UserMapper的接口中定义了方法,之前有2种情况,第一种情况是mybatis会自动放在map中,我们需要以myabatis设置的键访问这些数据,然后第二种是手动放到map中,这样我们可以自己设置键进行访问。
现在我们直接在参数上加一个注解@Param(),在value属性值里设置一个字符串,比如就叫username,给password也加这个注解。这个时候mybats仍然会把它放在map集合里,这个时候放在map集合里的键就不会自己设置了,它会把我们当前注解的value属性值作为键,以当前参数作为值。
/**
* 验证登陆(使用@Param注解)
* @param username
* @param password
* @return
*/
User checkLoginByParam(String username,String password);
@Test
public void testCheckLoginByParam(){
SqlSession sqlSession = SqlSessionUtil.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = mapper.checkLogin("admin","123456");
System.out.println(user);
}
@param:命名参数,可以帮我们设置Mybatis封装参数时候的键