一、MyBatis获取参数值的两种方式
1.${}
${}的本质就是字符串拼接,
2.#{}
#{}的本质就是占位符赋值
3.${}和#{}的区别
${}使用字符串拼接的方式拼接sql,若为字符串类型或日期类型的字段进行赋值时,需要手动加单引号;
#{}使用占位符赋值的方式拼接sql,此时为字符串类型或日期类型的字段进行赋值时,可以自动添加单引号
建议使用#{}因为#{}使用的是占位符赋值可以防止SQL注入而且不需要手动输入单引号
二、单个字面量类型的参数
若mapper接口中的方法参数为单个的字面量类型
此时可以使用 $ {}和#{}以任意的名称获取参数的值,注意${}需要手动加单引号
若mapper接口方法的参数为单个的字面量类型
此时可以通过#{}和$ {}以任意的内容获取参数值,一定要注意${}的单引号问题
<select id="getUserByUsername" resultType="User">
<!--select * from t_user where username = #{username} -->
select * from t_user where username = '${username}'
</select>
三、多个字面量类型的参数
若mapper接口方法的参数为多个的字面量类型
- 此时MyBatis会将参数放在map集合中,以两种方式存储数据
- a>以arg0, arg1…为键,以参数为值
- b>以param1 , param2…为键,以参数为值
- 因此,只需要通过#{}和${}访问map集合的键,就可以获取相对应的值
<select id="checkLogin" resultType="User">
<!-- select * from t_user where username = #{arg0} and password =#{arg1}-->
select * from t_user where username = '${arg0}' and password ='${arg1}'
</select>
四、map集合类型的参数
若mapper接口中的方法需要的参数为多个时,此时可以手动创建map集合,将这些数据放在map中
@Test
public void testCheckLoginByMap(){
SqlSession sqlSession =SqlSessionUtil.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
Map<String,Object> map = new HashMap<>();
map.put("username","admin");
map.put("password","123456");
User user = mapper.checkLoginByMap(map);
System.out.println(user);
}
<!--User checkLoginByMap(Map<String, Object> map);-->
<select id="checkLoginByMap" resultType="User">
select * from t_user where username = #{username} and password =#{password}
</select>
五、实体类类型的参数
若mapper接口中的方法参数为实体类对象时
此时可以使用 $ {}和#{},通过访问实体类对象中的属性名(只跟get和set方法有关系)获取属性值,注意${}需要手动加单引号
属性名:getset方法名中的get和set去掉剩下的首字母小写,叫做属性 。
@Test
public void testInsertUser(){
SqlSession sqlSession =SqlSessionUtil.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = new User(null,"root","123456",33,"女","123@qq.com");
mapper.insertUser(user);
}
<!--void insertUser(User user);-->
<insert id="insertUser">
insert into t_user values(null ,#{username},#{password},#{age},#{gender},#{email})
</insert>
六、使用@Param标识参数
可以通过@Param注解标识mapper接口中的方法参数
此时,会将这些参数放在map集合中,以@Param注解的value属性值为键,以参数为值;以param1,param2…为键,以参数为值;只需要通过 $ {}和#{}访问map集合的键就可以获取相对应的值,
注意${}需要手动加单引号
@Test
public void testCheckLoginByParam(){
SqlSession sqlSession =SqlSessionUtil.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = mapper.checkLoginByParam("admin","123456");
System.out.println(user);
}
<!--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>