Mybatis參數傳遞
概述
參數傳遞在Mybatis中也是非常重要的。存在諸多情況,如下所介紹的單個參數,多個參數,對象,集合和數組等。
1.單個的參數Mybatis不會做特殊處理
#{這里隨便寫什么都可以} 它都能把這里面的值取到
2.傳入對象POJO(普通的java類)..
#{對象的屬性名稱}
3.多個參數。Mybatis會做特殊處理。會把傳入的參數自動封裝成Map類型
Map 的key值就是從param1...paramN ..
map.put("param1",name)
map.put("param2,id")
@param("name") 可以使用這個注解 來自定義Map封裝數據的key值。
4.直接傳入Map
5.Collection(集合)類型(List,Set) ,數組。
Mybatis也會做特殊處理。。
如果是List或者Set 封裝到map中
如果是數組
map.put("array",你傳入的數組)
單個參數
Mapper接口的方法:
List<User> findUsersByUsername(String username);
Mapper.xml文件:
<select id="findUsersByUsername" resultType="user">
select
<include refid="Base_Column_List"/>
from tb_user
<where>
username = #{value}
</where>
</select>
注意:
其中方法名和id一致,#{}中的參數名與方法中的參數名k可以不一致, 映射結果的時候,select 后的字段列表要和bean中的屬性名一致, 如果不一致的可以用 as 來補充,特殊的也可以再mybatis中啟用駝峰,比如create_time 和 createTime;
多個參數
方法1:使用方法參數下標
Mapper接口的方法:
List<User> findUsersByUsernamePassword1(String username, String password);
對應的Mapper.xml:
<!--方法1.1-->
<select id="findUsersByUsernamePassword1" resultType="user" >
select * from tb_user where username = #{arg0} and password = #{arg1}
</select>
<!--方法1.2-->
<select id="findUsersByUsernamePassword1" resultType="user" >
select * from tb_user where username = #{0} and password = #{1}
</select>
注意:
有 些版本在使用上有不同,我使用的是 org.mybatis:mybatis:3.5.2版本,需要使用方法1.1。
方法2:使用注解 @Param 別名
Mapper接口的方法:
List<User> findUsersByUsernamePassword2(@Param("username") String username,
@Param("password") String password);
對應的Mapper.xml文件:
<select id="findUsersByUsernamePassword2" resultType="user">
select * from tb_user where username = #{username} and password = #{password}
</select>
方法3:使用實體
Mapper接口的方法:
List<User> findUsersByUsernamePassword3(User user);
// 調用方式
@Test
public void testFindUsersByUsernamePassword3(){
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = new User();
user.setUsername("admin");
user.setPassword("admin");
List<User> users = mapper.findUsersByUsernamePassword3(user);
System.out.println(users);
sqlSession.close();
}
Mapper.xml文件:
<select id="findUsersByUsernamePassword3" resultType="user" parameterType="user">
select * from tb_user where username = #{username} and password = #{password}
</select>
方法4:使用Map
Mapper接口的方法:
/*根據username和password查詢*/
List<User> findUsersByUsernamePassword(Map map);
//-----調用方式
@Test
public void testFindUsersByUsernamePassword() {
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
Map<String, Object> map = new HashMap<>();
map.put("username", "admin");
map.put("password", "admin");
List<User> users = mapper.findUsersByUsernamePassword(map);
System.out.println(users);
sqlSession.close();
}
/*
其中Map是mybatis自己配置好的直接使用就行。map中key的名字就是在#{}使用的個,map如何封裝就不用了管了
*/
對應Mapper.xml文件:
<select id="findUsersByUsernamePassword" resultType="user" >
select * from tb_user where username = #{username} and password = #{password}
</select>
注意:
這里使用Map來讀取參數,需要注意的是,使用Map可以像實體那樣訪問,這里的key就像實體的屬性名。
方法5:使用實體和@Param
Mapper接口的方法:
List<User> findUsersByUsernamePassword4(@Param("user") User user);
對應Mapper.xml文件:
<select id="findUsersByUsernamePassword4" resultType="user">
select * from tb_user where username = #{user.username}
and password = #{user.password}
</select>
注意:
如果使用注解結合實體的方式來傳參數的話,那么就需要使用實體.屬性名的方式來讀取參數。
方法6:使用Map和@Param
Mapper接口的方法:
List<User> findUsersByUsernamePassword5(@Param("map") Map map);
對應的Mapper.xml文件:
<select id="findUsersByUsernamePassword5" resultType="user">
select * from tb_user where username = #{map.username}
and password = #{map.password}
</select>
使用方法和方法5類似,不再贅述。
可迭代對象
傳遞List
前面的動態SQL中使用到了傳遞List的情況,這小節主要把幾種迭代對象都使用一遍。
Mapper接口方法:
List<User> findUsersByIds(List<Integer> id);
對應的Mapper.xml文件:
<!--select * from tb_user WHERE id in ( ? , ? , ? ) -->
<select id="findUsersByIds" resultType="user">
select * from tb_user
<where>
id in
<foreach collection="list" item="ite" open="(" separator="," close=")">
#{ite}
</foreach>
</where>
</select>
注意:List集合可以使用list,也可以使用collection。
使用Set
Mapper接口的方法:
List<User> findUsersByIds1(Set<Integer> ids);
對應的Mapper.xml文件
<select id="findUsersByIds2" resultType="user">
select * from tb_user where id in
<foreach collection="collection" item="item" open="(" separator="," close=")">
#{item}
</foreach>
</select>
注意:Set集合沒有像List那樣,Set只能使用collection。
傳遞數組
Mapper接口的方法:
List<User> findUsersByIds2(Integer[] ids);
對應的Mapper.xml文件
<select id="findUsersByIds1" resultType="user">
select * from tb_user
where id in
<foreach collection="array" item="item" open="(" separator="," close=")">
#{item}
</foreach>
</select>
傳遞Map
使用Map來做保存操作:
void saveUserByMap1(Map<String,Object> map);
對應的Mapper.xml文件:
<select id="saveUserByMap1">
insert into tb_user (user_id,username,password) values
(#{user_id},#{username},#{password});
</select>
單元測試:
@Test
public void testSaveUserByMap1(){
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
Map<String,Object> map = new HashMap<>();
map.put("user_id","root");
map.put("username","root");
map.put("password","root");
mapper.saveUserByMap1(map);
sqlSession.close();
}
傳遞List-Map
這里使用List和Map結合使用實現批量操作
Mapper接口文件的方法:
void saveUserByMap(List<Map<String,Object>> listMap);
對應的Mapper.xml文件:
<!--insert into tb_user (user_id,username,password)values (?,?,?) , (?,?,?) -->
<select id="saveUserByMap">
insert into tb_user (user_id,username,password)values
<foreach collection="collection" item="item" separator=",">
(#{item.userId},#{item.username},#{item.password})
</foreach>
</select>
單元測試:
@Test
public void testSaveUserByMap(){
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<Map<String,Object>> list = new ArrayList<>();
Map<String,Object> map = new HashMap<>();
map.put("userId","mybatis1");
map.put("username","mybatis1");
map.put("password","mybatis1");
Map<String,Object> map1 = new HashMap<>();
map1.put("userId","mybatis2");
map1.put("username","mybatis2");
map1.put("password","mybatis2");
list.add(map);
list.add(map1);
mapper.saveUserByMap(list);
sqlSession.close();
}
源碼地址:
https://gitee.com/ooyhao/JavaRepo_Public/tree/master/Mybatis
最后
如果覺得不錯的話,那就關注一下小編哦!一起交流,一起學習

