Mybatis (五) Mybatis參數傳遞

Mybatis參數傳遞

概述

​ 參數傳遞在Mybatis中也是很是重要的。存在諸多狀況,以下所介紹的單個參數,多個參數,對象,集合和數組等。git

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接口的方法:sql

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>

注意:mybatis

​ 其中方法名和id一致,#{}中的參數名與方法中的參數名k能夠不一致, 映射結果的時候,select 後的字段列表要和bean中的屬性名一致, 若是不一致的能夠用 as 來補充,特殊的也能夠再mybatis中啓用駝峯,好比create_time 和 createTime;app

多個參數

方法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。code

方法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

最後

若是以爲不錯的話,那就關注一下小編哦!一塊兒交流,一塊兒學習

相關文章
相關標籤/搜索