MyBatis 示例-傳遞多個參數

映射器的主要元素

本章介紹 select 元素中傳遞多個參數的處理方式。

測試類:com.yjw.demo.MulParametersTest

使用 Map 傳遞參數(不建議使用)

使用 MyBatis 提供的 Map 接口作爲參數來實現。

StudentDao

/**
 * 使用 Map 傳遞參數
 *
 * @param params
 * @return
 */
List<StudentDO> listByMap(Map<String, String> params);

StudentMapper.xml

<!-- 使用 Map 傳遞參數 -->
<select id="listByMap" parameterType="map" resultMap="BaseResultMap">
    select
    <include refid="Base_Column_List" />
    from t_student
    <where>
        <if test="ids != null and ids.size() > 0">
            AND id IN
            <foreach collection="ids" item="item" open="(" close=")" separator=",">
                #{item}
            </foreach>
        </if>
        <if test="name != null and name != ''">
            AND name LIKE CONCAT('%', #{name}, '%')
        </if>
        <if test="sex != null">
            AND sex = #{sex}
        </if>
        <if test="selfcardNo != null">
            AND selfcard_no = #{selfcardNo}
        </if>
    </where>
</select>

這個方法雖然簡單,但是有一個弊端:這樣設置的參數使用 Map,而 Map 需要鍵值對應,由於業務關聯性不強,造成代碼可讀性低。

使用註解方式傳遞參數(參數少時可以使用)

使用 MyBatis 的參數註解 @Param(org.apache.ibatis.annotations.Param)來實現想要的功能。

StudentDao

/**
  * 使用註解方式傳遞參數
  *
  * @param name
  * @param sex
  * @return
  */
 List<StudentDO> listByParamAnnotation(@Param("name") String name, 
                                       @Param("sex") Sex sex);

StudentMapper.xml

把映射器的 XML 修改爲無需定義參數類型。

<!-- 使用註解方式傳遞參數 -->
<select id="listByParamAnnotation" resultMap="BaseResultMap">
    select
    <include refid="Base_Column_List" />
    from t_student
    <where>
        <if test="name != null and name != ''">
            AND name LIKE CONCAT('%', #{name}, '%')
        </if>
        <if test="sex != null">
            AND sex = #{sex}
        </if>
    </where>
</select>

當我們把參數傳遞給後臺的時候,通過 @Param 提供的名稱 MyBatis 就會知道 #{name} 代表 name參數,參數的可讀性大大提高了。但是這回引起另一個麻煩,一條 SQL 擁有 10 個參數的查詢,如果我們都使用 @Param 方式,那麼參數將十分複雜,可讀性依舊不高,不過 MyBatis 爲我們提供了 JavaBean 定義參數的方式來解決這個問題。

使用 JavaBean 傳遞參數

在參數過多的情況下,MyBatis 允許組織一個 JavaBean,通過簡單的 setter 和 getter 方法設置參數,這樣就可以提高我們的可讀性。

首先,定義一個 StudentQuery 的 JavaBean

public class StudentQuery extends PageQuery {

    private List<Long> ids;

    private String name;

    private Byte sex;

    private Long selfcardNo;

    // get set 方法

}

StudentDao

/**
 * 根據條件獲取學生信息
 * 
 * @param studentQuery
 * @return
 */
List<StudentDO> listByConditions(StudentQuery studentQuery);

StudentMapper.xml

<!-- 根據條件獲取學生信息-->
<select id="listByConditions" parameterType="studentQuery" resultMap="BaseResultMap">
    select
    <include refid="Base_Column_List" />
    from t_student
    <where>
        <if test="ids != null and ids.size() > 0">
            AND id IN
            <foreach collection="ids" item="item" open="(" close=")" separator=",">
                #{item}
            </foreach>
        </if>
        <if test="name != null and name != ''">
            AND name LIKE CONCAT('%', #{name}, '%')
        </if>
        <if test="sex != null">
            AND sex = #{sex}
        </if>
        <if test="selfcardNo != null">
            AND selfcard_no = #{selfcardNo}
        </if>
    </where>
</select>

總結

下面對各種方式加以總結,以利於我們在實際操作中的應用。

  • 使用 Map 傳遞參數。因爲 Map 導致業務可讀性的喪失,從而導致後續擴展和維護的困難,我們應該在實際的應用中果斷廢棄這樣的傳遞參數的方式。
  • 使用 @Param 註解傳遞多個參數,這種方式的使用受到參數個數(n)的影響。當 n<= 5 時,它是最佳的傳參方式,它比用 JavaBean 更好,因爲它更加直觀;當 n>5 時,多個參數將給調用帶來困難。
  • 當參數個數多於5個時,建議使用 JavaBean 方式。

 

MyBatis 實用篇

MyBatis 概念

MyBatis 示例-簡介

MyBatis 示例-類型處理器

MyBatis 示例-傳遞多個參數

MyBatis 示例-主鍵回填

MyBatis 示例-動態 SQL

MyBatis 示例-聯合查詢

MyBatis 示例-緩存

MyBatis 示例-插件

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章