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