文章目录
实际开发中,使用mybatis自定义sql语句时经常要遇到参数的传递问题,经过总结,根据参数个数、是否使用注解细分,大致有7种传参方式,如下:
以User类为例:
class User{
Integer id;
String name;
String password;
}
一、万能方式
1.顺序传参
UserDao.java
User getUserById(String name,String pwd);
UserMapper.xml
<select id="getUserById" resultType="User">
select * from user where password = #{param2} and username = #{param1}
</select>
此方式单个,多个参数都适用。如果是更多参数,xml中用param3、param4......取值,需要注意 取值严格对应dao层的传参顺序
拿此案例举例:param1对应name,param2对应pwd
二、其他方式
2.形参名传参
(1)单个参数
UserDao.java
User getUserById(int id);
UserMapper.xml
<select id="getUserById" resultType="User">
select * from user where id = #{id}
</select>
或者
<select id="getUserById" resultType="User">
select * from user where id = #{hhh}
</select>
xml中使用 #{}作为占位符, 参数名任意。
当然,也可以使用${}作为占位符,但是需要注意${}是字符串拼接,有sql注入风险
(2)多个参数
UserDao.java
User getUserById(String name,String pwd);
UserMapper.xml
<select id="getUserById" resultType="User">
select * from user where username = #{name} and password = #{pwd}
</select>
xml中使用dao层自定义的参数名,但是 参数名必须一致
3.使用注解@Param
(1)单个参数
UserDao.java
User getUserById(@Param("id") int id);
UserMapper.xml
<select id="getUserById" resultType="User">
select * from user where id = #{id}
</select>
@Param这个注解用于指定key
需要注意xml中参数名与注解的value属性值需要一致,否则会报 Parameter 'hhh' not found. Available parameters are [id, param1]
提示参数’hhh‘找不到,[id,param1]为当前xml中可使用的参数名集合
(2)多个参数
UserDao.java
User getUserById(@Param("uname") String name, @Param("password") String pwd);
UserMapper.xml
<select id="getUserById" resultType="User">
select * from user where username = #{uname} and password = #{password}
</select>
同单个参数-使用注解方式,参数名必须与注解中自定义参数名一致
4.使用map集合
UserController.java
@GetMapping("/getUser")
public User getUser(){
Map map = new HashMap<>();
map.put("name","小白");
map.put("pwd","123");
User userById = userDao.getUserById(map);
return userById;
}
UserDao.java
User getUserById(Map map);
UserMapper.xml
<select id="getUserById" resultType="User">
select * from user where username = #{name} and password = #{pwd}
</select>
xml中参数名为map中对应值的key
5.使用List集合
UserController.java
@GetMapping("/getUserList")
public List<User> getUserList(){
ArrayList<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
List<User> userList = userDao.getUserByIds(list);
return userList;
}
UserDao.java
List<User> getUserByIds(List list);
UserMapper.xml
<select id="getUserByIds" resultType="User">
select * from user where id in
<foreach collection="list" item="item" open="(" separator="," close=")">
#{item}
</foreach>
</select>
List传参一般用于sql中的in
6.使用数组
数组传参类似List传参,也是使用了foreach,在此便不再赘述
7.使用对象
UserDao.java
User getUserById(User user);
UserMapper.xml
<select id="getUserById" resultType="User">
select * from user where username = #{name} and password = #{password}
</select>
多个参数也可以用实体类封装后直接传入,xml中参数名对应实体类属性名称
如果属性是私有的,注意一定要有get方法,不然取不到值