MyBatis获取参数

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;②实体类,直接使用实体类的属性名

一起学习,共同进步!

小楼一夜听春雨,深巷明朝卖杏花

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