問題引入
想必大家可能遇到過類似的錯誤,當(dāng)傳入多個參數(shù)時,映射文件無法獲得傳入的參數(shù)
我的例子
// javabean
public class User {
private int id;
private String name;
private byte age;
// 忽略了getter、setter方法
}
// 接口
public interface UserMapper {
List<User> select(String name,byte age);
}
// 映射文件
<select id="select" resultType="model.User">
select * from `user` where name = #{id} and age =#{age}
</select>
1. 利用參數(shù)出現(xiàn)的順序
Parameter ‘id’ not found. Available parameters are [arg1, arg0, param1, param2],這句話的意思就是id找不到,可用的參數(shù)是[arg1, arg0, param1, param2]。所以可使用參數(shù)出現(xiàn)的順序號碼引用參數(shù)恒序,第一個參數(shù)用arg0或param1表示,第二個參數(shù)用arg1或param2表示谁撼,以此類推(arg從0開始計數(shù)歧胁,param從1開始計數(shù))。
修改xml為如下方式:
<select id="select" resultType="model.User">
select * from `user` where name = #{arg0} and age =#{arg1}
</select>
// or
<select id="select" resultType="model.User">
select * from `user` where name = #{param1} and age =#{param2}
</select>
2.使用注解
給接口中方法的參數(shù)加上注解厉碟,xml不變
public interface UserMapper {
List<User> select(@Param("name") String name,@Param("age") byte age);
}
3.使用map
3.1把接口的形參改為Map
// 接口
public interface UserMapper {
List<User> select(Map params);
}
3.2 把需要的參數(shù)封裝在map中
Map params = new HashMap();
params.put("name", "王尼瑪");
params.put("age", 32);
List<User> list = userMapper.select(params);
4.把參數(shù)封裝在Javabean中
4.1 把接口的形參改為javabean
// 接口
public interface UserMapper {
List<User> select(User user);
}
4.2 把需要的參數(shù)封裝在javabean中
User user = new User();
user.setName("四");
user.setAge((byte)43);
List<User> list = userMapper.select(user);
so,我覺得應(yīng)該把題目改為喊巍,mybatis中傳入多個參數(shù)的2個解決方法。畢竟3箍鼓、4是通過把多個參數(shù)轉(zhuǎn)化為1個參數(shù)的方式解決問題的崭参,哈哈。
5 拓展(接口中傳入?yún)?shù)的各種情況)
5.1 當(dāng)只有一個參數(shù)時
使用arg0,param1獲得參數(shù)是一直有效的款咖,但是個人不推薦這樣做何暮,畢竟看起來不優(yōu)雅
5.1.1 參數(shù)是基本類型
xml中標(biāo)簽內(nèi)的變量名可以隨便寫奄喂,#{id},#{ids}海洼,#{123}跨新,#{xxgdsgdg},等都可以獲得到參數(shù)。
5.1.2 參數(shù)是javabean
xml中標(biāo)簽內(nèi)直接填寫Javabean中的屬性名
5.1.3 參數(shù)是數(shù)組
使用array獲得參數(shù)贰军,再用foreach循環(huán)
5.1.4 參數(shù)是List
使用list或collection獲得參數(shù)玻蝌,再用foreach循環(huán)
5.1.5 參數(shù)是Set
使用collection獲得參數(shù)蟹肘,再用foreach循環(huán)
5.2 當(dāng)有多個參數(shù)時
使用argN词疼、paramN或@param定位到某個參數(shù),再靈活使用ognl就ok了帘腹。比如#{user.name}贰盗、#{users[0].name}。