MyBatis获取参数值的两种方式:${}和#{}
${}的本质就是字符串拼接,#{}的本质就是占位符赋值
在JDBC中大家应该深有体会,${}由于是字符串拼接,会造成sql注入问题,因此在大多数情况下,获取参数会使用#{}的方式。
第一种情况:获取单个参数,比如根据用户名查找用户
User getUserByUsername(String username);
在UserMapper.xml中的代码为:
直接根据username获取即可,注意,这里的username可以理解为方法中的形参,这里的形参用任何字符都可以,比如#{aaa}、#{bbb}、#{1}等等,因为MyBatis执行sql时要看实际参数,就像下面传来的"admin"。${}与#{}相似,唯一不同的除了要加 ' ' 拼接字符串外,还有${}中形参不能为数字,因为${3}会被直接解析为表达式,无法作为形参被解析。
@Test
public void testGetUserByUsername(){
SqlSession sqlSession = SqlSessionUtil.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User admin = mapper.getUserByUsername("admin");
System.out.println(admin);
sqlSession.close();
}
第二种情况:获取多个参数,比如验证用户登录
User checkLogin(String username,String password);
在UserMapper.xml中的代码为
这里大家按照惯性思维会考虑#{username}和#{password},但是MyBatis中的多参数被接收为map容器了,容器中的key没有username和password,只有arg0、arg1......和param1、param2......
如果硬要使用username和password来清晰的表示参数呢?MyBatis自然也考虑到这些,这就是使用@param注解的方式
同样的验证用户登录的接口还可以这样写
User checkLoginByParam(@Param("username") String username,@Param("password") String password);
这样,我们就可以使用#{username}和#{password}的方式获取参数了
第三种情况:实体类类型的参数,比如添加用户
void insertUser(User user);
当参数为实体类时,可以通过访问实体类属性名的方式访问其属性值,因此在UserMapper.xml中的代码为
insert into t_user values(null,#{username},#{password},#{age},#{gender},#{email});
属性值为实体类中的get/set方法构造出来的值,并不完全是类中的定义的属性。只是因为我们在定义完类后,直接使用IDEA的getter/setter方法,把所有的属性都选中了,如果有一个未被选中的,那么这个值就无法作为属性名被传递。
总结:所有的参数传递都可以分为两种①使用注解,用注解的value;②实体类,直接使用实体类的属性名
一起学习,共同进步!
小楼一夜听春雨,深巷明朝卖杏花