1. 程式人生 > >MyBatis傳入引數與parameterType

MyBatis傳入引數與parameterType

Mybatis的Mapper檔案中的select、insert、update、delete元素中有一個parameterType屬性,用於對應的mapper介面方法接受的引數型別。

可以接受的引數型別有基本型別和複雜型別。

mapper介面方法一般接受一個引數,可以通過使用@Param註釋將多個引數繫結到一個map做為輸入引數。

  1. 簡單資料型別

    mapper介面方法:

    1 User selectByPrimaryKey(Integer id);

    sql對映:

    1 2 3 4 5 6 <select id="selectByPrimaryKey" resultMap
    ="BaseResultMap" parameterType="java.lang.Integer" > select <include refid="Base_Column_List" /> from base.tb_user where id = #{id,jdbcType=INTEGER} </select>

    對於簡單資料型別,sql對映語句中直接#{變數名}這種方式引用就行了,其實這裡的”變數名”可以是任意的。mapper介面方法傳遞過來的值,至於其叫什麼名字其實是不可考也沒必要知道的。
    而且JAVA反射只能獲取方法引數的型別,是無從得知方法引數的名字的。

    比如上面這個示例中,使用#{id}來引用只是比較直觀而已,使用其他名字來引用也是一樣的。所以當在if元素中test傳遞的引數時,就必須要用_parameter來引用這個引數了。像這樣:

    1 2 3 4 5 6 7 8 <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer" > select <include refid="Base_Column_List" /> from tb_user <if test="_parameter != 0"
    > where id = #{id,jdbcType=INTEGER} </if> </select>

    如果test測試條件中使用id就會提示錯誤,因為這個引數其實沒有名字,只是一個值或引用而已,只能使用_parameter來引用。

  2. 物件型別

    傳入JAVA複雜物件型別的話,sql對映語句中就可以直接引用物件的屬性名了,這裡的屬性名是實實在在的真實的名字,不是隨意指定的。
    mapper介面方法:

    1 int insert(User user);

    sql對映:

    1 2 3 <insert id="insert" parameterType="User" useGeneratedKeys="true" keyProperty="id"> insert into tb_user (name, sex) values (#{name,jdbcType=CHAR}, #{sex,jdbcType=CHAR})

    雖然可以明確的引用物件的屬性名了,但如果要在if元素中測試傳入的user引數,仍然要使用_parameter來引用傳遞進來的實際引數,因為傳遞進來的User物件的名字是不可考的。如果測試物件的屬性,則直接引用屬性名字就可以了。

    測試user物件:

    1 <if test="_parameter != null">

    測試user物件的屬性:

    1 <if test="name != null">
  3. map型別

    傳入map型別,直接通過#{keyname}就可以引用到鍵對應的值。使用@param註釋的多個引數值也會組裝成一個map資料結構,和直接傳遞map進來沒有區別。

    mapper介面:

    1 int updateByExample(@Param("user") User user, @Param("example") UserExample example);

    sql對映:

    1 2 3 4 5 6 7 <update id="updateByExample" parameterType="map" > update tb_user set id = #{user.id,jdbcType=INTEGER}, ... <if test="_parameter != null" > <include refid="Update_By_Example_Where_Clause" /> </if>

    注意這裡測試傳遞進來的map是否為空,仍然使用_parameter

  4. 集合型別

    You can pass a List instance or an Array to MyBatis as a parameter object. When you do, MyBatis will automatically wrap it in a Map, and key it by name. List instances will be keyed to the name “list” and array instances will be keyed to the name “array”.

    可以傳遞一個List或Array型別的物件作為引數,MyBatis會自動的將List或Array物件包裝到一個Map物件中,List型別物件會使用list作為鍵名,而Array物件會用array作為鍵名。

    集合型別通常用於構造IN條件,sql對映檔案中使用foreach元素來遍歷List或Array元素。

    mapper介面:

    1 User selectUserInList(List<Interger> idlist);

    sql動態語句對映:

    1 2 3 4 5 6 7 8 9 <select id="selectUserInList" resultType="User"> SELECT * FROM USER WHERE ID in <foreach item="item" index="index" collection="list" open="(" separator="," close=")"> #{item} </foreach> </select>
  5. 物件型別中的集合屬性

    對於單獨傳遞的List或Array,在SQL對映檔案中對映時,只能通過list或array來引用。但是如果物件型別有屬性的型別為List或Array,則在sql對映檔案的foreach元素中,可以直接使用屬性名字來引用。
    mapper介面:

    1 List<User> selectByExample(UserExample example);

    sql對映檔案:

    1 2 3 <where > <foreach collection="oredCriteria" item="criteria" separator="or" > <if test="criteria.valid" >

    在這裡,UserExample有一個屬性叫oredCriteria,其型別為List,所以在foreach元素裡直接用屬性名oredCriteria引用這個List即可。

    item=”criteria”表示使用criteria這個名字引用每一個集合中的每一個List或Array元素