MyBatis获取参数值的两种方式

前言

学过mybatis的,建议直接看5.4和5.5,因为这是开发中常用的。
从最基础的开始讲,不断升级。
参考资料:B站尚硅谷杨博超老师的SSM整合视频。

5、MyBatis获取参数值的两种方式

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

${}的本质就是字符串拼接,#{}的本质就是占位符(即?)赋值 。就是jdbc那一套

${}使用字符串拼接的方式拼接sql语句,若为字符串类型或日期类型的字段进行赋值时,需要手动加单 引 号;

#{}使用占位符赋值的方式拼接sql语句,此时为字符串类型或日期类型的字段进行赋值时, 可以自 动添加单引号

常用#{}

5.1、单个字面量类型的参数

若mapper接口中的方法参数为单个的字面量类型

此时可以使用 ${} 和#{} 以任意的名称获取参数的值,注意 需要手动加单引号包起来,比 如 ′ {}需要手动加单引号包起来,比如 ' 需要手动加单引号包起来,比{usernaem}’

int a = 1; 则1就是字面量,你看到的是1,他就是1. 字符串、基本数据类型/包装类

 <!--    User getUserById(int id);-->
    <select id="getUserByName" resultType="User">
        select * from t_user where id=#{id}
        <!--select * from t_user where id=#{abkk}也是可以的。单个字面量类型的参数,如果不加@Param注解,可以用任意的名称获取参数的值。-->
    </select>
 @Test
    public void testGetUserById(){
        //sqlSessionUtils是自己写的
        SqlSession sqlSession = sqlSessionUtils.getSqlSession();
        //通过getMapper方法,获取UserMapper接口的代理实现类 对象
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        User user = userMapper.getUserById(2);
        System.out.println(user);
    }

5.2、多个字面量类型的参数

若mapper接口中的方法参数为多个时

此时MyBatis会自动将这些参数放在一个map集合中,有2种存储数据的方式,

方式一:以arg0,arg1…为键,以参数为值;

方式二:以param1,param2…为键,以参数为值;

注意:第一个参数只能写arg0或param1这样才能对应。说白了,要用mybatis定义的键来访问。

因此只需要通过${}和#{}访问map集合的键就可以获取相 对应的

值,注意${}需要手动加单引号

比如:User checkLogin(String username,String password)

select * from t_user where username=#{arg0} and password=#{arg1}

但是,也可以自己手动创建map集合(看5.3),自己指定键是啥,值是啥。前面讲的是咱只能指定值是啥,键得用mybatis写好的。

<!--    User checkLogin(String username,String password);-->
    <select id="checkLogin" resultType="User">
        select * from t_user where username=#{arg0} and password=#{arg1}
    </select>
   @Test
    public void testCheckLogin(){
        SqlSession sqlSession = sqlSessionUtils.getSqlSession();
        //通过getMapper方法,获取UserMapper接口的代理实现类 对象
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        User user = userMapper.checkLogin("root","root");
        System.out.println(user);
    }

5.3、map集合类型的参数

若mapper接口中的方法需要的参数为多个时,此时可以手动创建map集合(当然,你也可以直接使用mybatis已创建的arg0或param1这些键),将这些数据放在 map中

只需要通过${}和#{}访问map集合的键就可以获取相对应的值,

注意${}需要手动加单引号

<!--UserMapper接口里的 User checkLoginByMap(Map<String,String> map);-->
    <select id="checkLoginByMap" resultType="User">
        select * from t_user where username=#{username} and password=#{password}
    </select>
    @Test
    public void testCheckLoginByMap(){
        SqlSession sqlSession = sqlSessionUtils.getSqlSession();
        //通过getMapper方法,获取UserMapper接口的代理实现类 对象
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        //创建Map集合
        HashMap<String, String> map = new HashMap<>();
        //自己指定键和值
        map.put("username","root");
        map.put("password","root123");
        User user = userMapper.checkLoginByMap(map);
        System.out.println(user);
    }

5.4、实体类类型的参数(超重点,开发看这个)

若mapper接口中的方法参数为实体类对象时

此时可以使用${}和#{},

通过访问实体类对象中的属性名获取属性值,注意${}需要手动加单引号

你也可以认为属性名–属性值也是键值对,但是,访问时,其实是调用的get方法。

类中必须提供get、set方法。

比如 int addUser(User user)

严格来说,属性不一定是成员变量,成员变量不一定是属性。属性是get、set方法去掉get和set后,首字母小写。

比如:getId( ) 则属性就是id

getTotalPrice()则属性就是totalPrice,而totalPrice可以不是成员变量。但是我可以通过#{totalPrice}来访问到,底层调用的是get方法。

  <!--    int insertUser(User user);-->
    <insert id="insertUser">
        <!-- {}里写的是属性名-->
        insert into t_user values(null,#{username},#{password},#{age},#{gender},#{email})
    </insert>
   @Test
    public void testInsertUser2(){
        SqlSession sqlSession = sqlSessionUtils.getSqlSession();
        //通过getMapper方法,获取UserMapper接口的代理实现类 对象
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        User user = new User(null, "莎士比亚", "yyuu88", 28, "男", "123ree@qq.com");
        //传的是一个User对象(实体对象)
        int res = userMapper.insertUser(user);
        System.out.println("结果"+res);
    }

5.5、使用@Param标识参数(超级重点,开发看这个)

可以通过@Param注解标识mapper接口中的方法参数

一个参数时也能用@Param注解。

此时,mybatis的底层仍会将这些参数放在map集合中,有两种数据存储方式。①会以@Param注解的value属性值为,以参数为;②以 param1,param2…为键,以参数为值,这是mybatis以它自己的方式来存储数据; 既然你都用@Param来自定义键了,为啥还用②,所以,如果你用了@Param,推荐你用自定义的键。

只需要通过${}和#{}访问map集合的键就可以获取相对应 的值,

注意${}需要手动加单引号

只给注解的value属性设定值时,可以省略value=

比如:@Param(value=“username”)可以写成@Param(“username”)

   <!--User checkLoginByParam(@Param("username") String username,@Param("password") String password);
{}里是使用@Param定义的键-->
    <select id="checkLoginByParam" resultType="User">
        select * from t_user where username=#{username} and password=#{password}
    </select>
   @Test
    public void testLoginByParam(){
        SqlSession sqlSession = sqlSessionUtils.getSqlSession();
        //通过getMapper方法,获取UserMapper接口的代理实现类 对象
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        User user = userMapper.checkLoginByParam("root", "root123");
        System.out.println(user);
    }
UserMapper接口里:
User checkLoginByParam(@Param("username") String username,@Param("password") String password);

5.6、开发经验推荐

记住2种就行

  • 实体类类型的参数。直接通过属性名来访问(前提,必须提供get、set方法)
  • 其他有参数情况都用@Param注解来自定义键
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值