MyBatis获取参数

MyBatis获取参数值的两种方式:${}和#{}

${}的本质就是字符串拼接,#{}的本质就是占位符赋值

在JDBC中大家应该深有体会,${}由于是字符串拼接,会造成sql注入问题,因此在大多数情况下,获取参数会使用#{}的方式。

第一种情况:获取单个参数,比如根据用户名查找用户

User getUserByUsername(String username);

在UserMapper.xml中的代码为:

<!--     User getUserByUsername(String username);   -->
    <select id="getUserByUsername" resultType="User">
        select * from t_user where username = #{username}
    </select>

直接根据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中的代码为

<!--  User checkLogin(String username,String password);  -->
<select id="checkLogin" resultType="User">
        select * from t_user where username = #{arg0} and password = #{arg1}
    </select>

这里大家按照惯性思维会考虑#{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}的方式获取参数了

<!--    User checkLoginByParam(@Param("username") String username,@Param("password") String password);-->
<select id="checkLoginByParam" resultType="User">
    select * from t_user where username = #{username} and password = #{password}
</select>

第三种情况:实体类类型的参数,比如添加用户

void insertUser(User user);

当参数为实体类时,可以通过访问实体类属性名的方式访问其属性值,因此在UserMapper.xml中的代码为

    <!--    void insertUser(User user);-->
    <insert id="insertUser" parameterType="User">
        insert into t_user values(null,#{username},#{password},#{age},#{gender},#{email});
    </insert>

属性值为实体类中的get/set方法构造出来的值,并不完全是类中的定义的属性。只是因为我们在定义完类后,直接使用IDEA的getter/setter方法,把所有的属性都选中了,如果有一个未被选中的,那么这个值就无法作为属性名被传递。

总结:所有的参数传递都可以分为两种①使用注解,用注解的value;②实体类,直接使用实体类的属性名

一起学习,共同进步!

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YuuuZh。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值