前言
学过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注解来自定义键