嚴(yán)格來(lái)說(shuō),map適用幾乎所有場(chǎng)景,但是我們用得不多。原因有兩個(gè):首先,map是一個(gè)鍵值對(duì)應(yīng)的集合,使用者要通過(guò)閱讀它的鍵,才能明了其作用;其次,使用map不能限定其傳遞的數(shù)據(jù)類型,因此業(yè)務(wù)性質(zhì)不強(qiáng),可讀性差,使用者要讀懂代碼才能知道需要傳遞什么參數(shù)給它,所以不推薦用這種方式傳遞多個(gè)參數(shù)。
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為開(kāi)發(fā)者提供了一個(gè)注解@Param(org.apache.ibatis.annotations.Param),可以通過(guò)它去定義映射器的參數(shù)名稱,使用它可以得到更好的可讀性 這個(gè)時(shí)候需要修改映射文件的代碼,此時(shí)并不需要給出parameterType屬性,讓MyBatis自動(dòng)探索便可以了 使可讀性大大提高,使用者也方便了,但是這會(huì)帶來(lái)一個(gè)麻煩。如果SQL很復(fù)雜,擁有大于10個(gè)參數(shù),那么接口方法的參數(shù)個(gè)數(shù)就多了,使用起來(lái)就很不容易,不過(guò)不必?fù)?dān)心,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>
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>
在某些情況下可能需要混合使用幾種方法來(lái)傳遞參數(shù)。舉個(gè)例子,查詢一個(gè)角色,可以通過(guò)角色名稱和備注進(jìn)行查詢,與此同時(shí)還需要支持分頁(yè)
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種傳遞多個(gè)參數(shù)的方法,對(duì)各種方法加以點(diǎn)評(píng)和總結(jié),以利于我們?cè)趯?shí)際操作中的應(yīng)用。
?使用 map 傳遞參數(shù)導(dǎo)致了業(yè)務(wù)可讀性的喪失,導(dǎo)致后續(xù)擴(kuò)展和維護(hù)的困難,在實(shí)際的應(yīng)用中要果斷廢棄這種方式。
?使用 @Param 注解傳遞多個(gè)參數(shù),受到參數(shù)個(gè)數(shù)(n)的影響。當(dāng) n≤5 時(shí),這是最佳的傳參方式,它比用 Java Bean 更好,因?yàn)樗又庇^;當(dāng) n>5 時(shí),多個(gè)參數(shù)將給調(diào)用帶來(lái)困難,此時(shí)不推薦使用它。
?當(dāng)參數(shù)個(gè)數(shù)多于5個(gè)時(shí),建議使用 Java Bean 方式。
?對(duì)于使用混合參數(shù)的,要明確參數(shù)的合理性。
更多建議: