1. 程式人生 > >11、Mybatis處理傳入多個引數

11、Mybatis處理傳入多個引數

一、

當傳入一個引數時,mybatis直接把輸入的引數繫結到#{} 中的變數中。但是mybatis如何處理傳入多個引數的情況呢?
例如一個庫表users,有id、name、age三個欄位,現在通過傳入id、name兩個引數來查詢整條記錄。對應的介面如下:

public interface UserDao {

    /*介面中出入兩個引數,mybatis要處理兩個輸入引數*/
    public User getUser(int id, String name);

}

那麼mybatis如何處理傳入多個引數呢?傳入多個引數時,多個引數會被封裝成一個map,map的鍵分別對應param1、param2 …… paramN,或者map的鍵對應0、1 …… N,而鍵對應的value值才是介面中傳入的資料。
例如上面介面傳入的是id,name兩個變數,假設兩個變數對應的值分別為 1和”Tom”,這兩個變數會被封裝成一個map,即{“param1” : 1; “param2” : “Tom”}或者{“0” : 1; “1” : “Tom”},name在sql的對映檔案中處理傳入的這兩個引數時,不能用下面的形式,否則會報sql語句繫結錯誤:

    <select id="getUser" resultType="com.lzj.mybaits.bean.User">
        select * from users where id=#{id} and name=#{name}
    </select>

因為傳入的map中根本不存在id和name的鍵,而應該寫成:

    <select id="getUser" resultType="com.lzj.mybaits.bean.User">
        select * from users where id=#{0} and name=#{1}
</select>

或者寫成:

    <select id="getUser" resultType="com.lzj.mybaits.bean.User">
        select * from users where id=#{param1} and name=#{param2}
    </select>

注意在寫上面的語句中,可以不用parameterType定義輸入的型別,因為mybatis會自動對映型別,但是一定要定義返回型別,例如用resultType指定。

二、

當mybatis處理多個傳入引數時,用上面的方式不容易分辨,也可以在mybatis中使用命名的鍵,要用@Param註解來實現,介面應該定義成如下:

public interface UserDao {

    /*@Param註解可以指定對映到mybatis中的鍵的名字*/
    public User getUser(@Param("id") int id, @Param("name") String name);

}

在mybatis中的對映檔案中就可以通過id和name的鍵來獲取輸入的引數值了,像下面的形式:

    <select id="getUser" resultType="com.lzj.mybaits.bean.User">
        select * from users where id=#{id} and name=#{name}
    </select>

三、

當傳入的引數較多時,建議傳入一個POJO或者一個map物件,mybatis處理時可以直接通過#{}獲取pojo中屬性的值或者獲取map中鍵的值。

四、

當介面中既傳入了基本型別,又傳入了自定義的物件型別,例如如下形式

public interface UserDao {

    public User getUser(@Param("id") int id, @Param("us") User user);

}

在mybatis處理對映檔案時,mybatis會把id和user封裝到一個map中,可以通過#{param1},#{param2.id},#{param2.name},#{param2.age}來獲取輸入的值。 還可以通過#{id},#{us.id},#{us.name},#{us.age}來獲取傳入的引數值。

五、

如果介面中傳入的是Collection型別的(包括List和Set)或者陣列型別的,也會被封裝成map型別的。
例如如果傳入的是Collection型別的(包括List和Set),在mybatis中可以通過collection鍵來獲取輸入的值,#{collection},當然如果還是List型別的,還可以通過#{list}來獲取。
如果介面傳入的是陣列型別的,在mybatis中可以通過#{array}來獲取輸入的引數。
例如介面為

public interface UserDao {

    public User getUser(List<Integer> usersList);

}

在mybatis中獲取介面中輸入的資料時,可以通過下面的形式:#{list[0]}、#{list[1]}、{list[2]} …… {list[n]}。當然也可以通過@Param註解更改鍵的預設名字。