MyBatis获取参数值的两种方式

目录

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





      

      

      
            
      

      
            
                  
                  
                        
                        
                        
                        
                  
            
      

      
      
            
      

1.单个字面量类型的参数

若mapper接口中的方法参数为单个的字面量类型 此时可以使用${}和#{}以任意的名称获取参数的值,注意${}需要手动加单引号

比如刚刚我们写的案例,根据用户名查询用户信息,它的参数就是单个的字符串类型,那么我们在映射文件中可以这么写。






      
      
      

然后我们进行测试

@Test
public void testGetUserByUsername(){
	SqlSession sqlSession = SqlSessionUtil.getSqlSession();
	UserMapper mapper = sqlSession.getMapper(UserMapper.class);
	User user = mapper.getUserByUsername("admin");
	System.out.println(user);
}

MyBatis获取参数值的两种方式_第1张图片

我们可以看看sql语句,我们自己写的是#{},但是结果却变成了问号,所以说我们使用#{}的时候,在底层#{}会直接被当做占位符来解析。

但是当我们把#{}里的内容改一下

MyBatis获取参数值的两种方式_第2张图片

MyBatis获取参数值的两种方式_第3张图片会发现这里面的值随便写,都没有问题,其实参数里的username,把这个数据真正传输到映射文件的时候,在mybatis执行sql语句的底层代码里,根本不知道参数名叫什么,只知道我们传过来的值是admin,并不知道我们传过来的参数名叫username,我们在#{}这个地方可以用任意内容获取当前参数值,但是建议我们写的有意义些。  


那么我们用${}的时候,会报错。

MyBatis获取参数值的两种方式_第4张图片我们需要手动加单引号


MyBatis获取参数值的两种方式_第5张图片


2.多个字面量类型的参数

若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没有找到。

那么我们应该这么解决:


MyBatis获取参数值的两种方式_第6张图片


还有一种解决方式:


MyBatis获取参数值的两种方式_第7张图片


那么这是为什么呢??

如果我们当前的参数有2个,这个时候MyBatis会自动把这两个参数放在一个Map集合中,然后放在Map集合中,会以两种方式存储数据

第一种方式arg0,arg1的方式,以arg0,arg1为键,以参数值为值。

第二种方式param1,param2的方式,以param1,param2为键,以参数值为值


3.map集合类型的参数

若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集合中。


4.实体类类型的参数

若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);
}


5.使用@Param标识参数

我们还是以登陆功能为例。

我们之前在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);
}

MyBatis获取参数值的两种方式_第8张图片这样也是可以的

@param:命名参数,可以帮我们设置Mybatis封装参数时候的键   

你可能感兴趣的:(MyBatis,mybatis,java,mysql)