1、搭建新的module:mybatis_parameter
MyBatis获取参数值的两种方式:${}和#{}
${}的本质就是字符串拼接,采用sql拼接,无法防止sql注入
#{}的本质就是占位符赋值 ,采用预编译 防止sql注入
不同参数使用案例
2、单个字面量类型的参数 int i = 1;
如果mapper接口中的方法参数为单个的字面量类型,此时可以使用#{}和${}以任意的名称获取参数的值,如果使用${},注意需要手动添加单引号。
select * from user where username = #{username};
打印结果:Preparing: select * from user where username = ?;
select * from user where username = '${username}';
打印结果:Preparing: select * from user where username = 'qqq'
#方式可以防止SQL注入
//$的不加单引号会如下报错
select * from user where username = ${username};
Unknown column 'qqq' in 'where clause'
3、多个字面量类型的参数
如果mapper接口中的方法参数为多个时,此时MyBatis会自动将这些参数放在一个map集合(key,value)中,以arg0, arg1...为键,以参数为值;或者以param1, param2...为键,以参数为值。因此只需要通过#{}和${}访问map集合的键就可以获取相对于的值,如果使用${},注意需要手动添加单引号。
//验证账号密码是否正确
User checkLogin(String username,String password);
//对应sql语句
select * from user where username = #{arg1} and password = #{arg0}
select * from user where username = #{param1} and password = #{param2}
select * from user where username = '${arg1}' and password = '${arg0}'
select * from user where username = '${param1}' and password = '${param2}'
4、map集合类型的参数
如果mapper接口中的方法参数为多个时,此时可以手动创建一个map集合,将这些参数放在map集合中,只需要通过#{}和${}访问map集合的键(自己定义的键)就可以获取相对于的值,如果使用${},注意需要手动添加单引号。
//使用Map验证登录
User checkLoginByMap(Map<String,Object> map);
//对应测试类
@Test
public void testCheckLoginMap(){
Map<String,Object> map = new HashMap<>();
map.put("username","qqq");
map.put("password","456");
User user = mapper.checkLoginByMap(map);
System.out.println(user);
}
正确写法(要写自己创建的key)
select * from user where username = #{username} and password = #{password}
对应正确结果
否则返回结果为空
select * from user where username = #{param1} and password = #{param1}
返回结果:null
5、实体类类型的参数 用的较多
如果mapper接口中的方法参数为实体类对象时,此时可以使用#{}和${},通过访问实体类对象中的属性名称获取属性值,如果使用${},注意需要手动添加单引号
//向User表插入用户信息
int insertUser(User user);
//对应sql语句
insert into user values(null,#{username},#{password},#{age},#{sex},#{email})
6、使用@Param标识参数
可以通过@Param注解标识mapper接口中的方法参数,此时MyBatis会将这些参数放在map集合中,以@Param注解的value属性值为键,以参数为值;以param1,param2...为键,以参数为值;只需要通过#{}和${}访问map集合的键就可以获取相对于的值,如果使用${},注意需要手动添加单引号。
//通过Param验证登录信息正确性
User checkLoginByParam(@Param("username") String username,@Param("password")String password);
//对应sql
//@Param注解的value属性值为键,以参数为值
select * from user where username = '${username}' and password = '${password}'
//以param1,param2...为键,以参数为值
select * from user where username = '${param1}' and password = '${param2}'
错误写法:
select * from user where username = #{aaa} and password = #{bbb}
提示信息:
Parameter 'aaa' not found. Available parameters are [password, param1, username, pa