方法一:使用map接口傳遞參數
嚴格來說,map適用幾乎所有場景,但是我們用得不多。原因有兩個:首先,map是一個鍵值對應的集合,使用者要通過閱讀它的鍵,才能明了其作用;其次,使用map不能限定其傳遞的數據類型,因此業務性質不強,可讀性差,使用者要讀懂代碼才能知道需要傳遞什么參數給它,所以不推薦用這種方式傳遞多個參數。
public List<Role> findRolesByMap(Map<String, Object> parameterMap);
<select id="findRolesByMap" parameterType="map" resultType="role"> select id, role_name as roleName, note from t_role where role_name like concat('%', #{roleName}, '%') and note like concat('%', #{note}, '%') </select>
方法二:使用注解傳遞多個參數
MyBatis為開發者提供了一個注解@Param(org.apache.ibatis.annotations.Param),可以通過它去定義映射器的參數名稱,使用它可以得到更好的可讀性
這個時候需要修改映射文件的代碼,此時並不需要給出parameterType屬性,讓MyBatis自動探索便可以了
使可讀性大大提高,使用者也方便了,但是這會帶來一個麻煩。如果SQL很復雜,擁有大於10個參數,那么接口方法的參數個數就多了,使用起來就很不容易,不過不必擔心,MyBatis還提供傳遞Java Bean的形式。
public List<Role> findRolesByAnnotation(@Param("roleName") String rolename, @Param("note") String note);
<select id="findRolesByAnnotation" resultType="role"> select id, role_name as roleName, note from t_role where role_name like concat('%', #{roleName}, '%') and note like concat('%', #{note}, '%') </select>
方法三:通過Java Bean傳遞多個參數
public List<Role> findRolesByBean(RoleParams roleParam);
<select id="findRolesByBean" parameterType="com.xc.pojo.RoleParams" resultType="role"> select id, role_name as roleName, note from t_role where role_name like concat('%', #{roleName}, '%') and note like concat('%', #{note}, '%') </select>
方法四:混合使用
在某些情況下可能需要混合使用幾種方法來傳遞參數。舉個例子,查詢一個角色,可以通過角色名稱和備注進行查詢,與此同時還需要支持分頁
public List<Role> findByMix(@Param("params") RoleParams roleParams, @Param("page") PageParam PageParam);
<select id="findByMix" resultType="role"> select id, role_name as roleName, note from t_role where role_name like concat('%', #{params.roleName}, '%') and note like concat('%', #{params.note}, '%') limit #{page.start}, #{page.limit} </select>
總結:
描述了4種傳遞多個參數的方法,對各種方法加以點評和總結,以利於我們在實際操作中的應用。
•使用map傳遞參數導致了業務可讀性的喪失,導致后續擴展和維護的困難,在實際的應用中要果斷廢棄這種方式。
•使用@Param注解傳遞多個參數,受到參數個數(n)的影響。當n≤5時,這是最佳的傳參方式,它比用Java Bean更好,因為它更加直觀;當n>5時,多個參數將給調用帶來困難,此時不推薦使用它。
•當參數個數多於5個時,建議使用Java Bean方式。
•對於使用混合參數的,要明確參數的合理性。