MyBatis Mapper 方法傳遞多個參數時,不能像單參數那樣直接用 _parameter 或屬性名訪問。本文系統梳理三種主流方案:**@Param 註解(推薦)**、**Map 封裝**、**JavaBean 封裝**,並對比優缺點與適用場景。
<!-- Mapper 接口 -->
List<String> selectAirports(Boolean mapping);
<!-- XML -->
<select id="selectAirports" resultType="string" parameterType="boolean">
SELECT ... <if test="_parameter == true">...</if>
</select>
單參數時,MyBatis 自動將參數綁定為 _parameter,也可直接用參數名(如 mapping)。
public interface AirlineMapper {
Airline selectEffectiveAirline(
@Param("departureAirport") String departureAirport,
@Param("arrivalAirport") String arrivalAirport,
@Param("status") BigDecimal status
);
}
<select id="selectEffectiveAirline" resultMap="BaseResultMap">
SELECT <include refid="Base_Column_List"/>
FROM USR_AIR_LINE
<where>
<if test="departureAirport != null">DEPARTURE_AIRPORT = #{departureAirport}</if>
<if test="arrivalAirport != null">AND ARRIVAL_AIRPORT = #{arrivalAirport}</if>
<if test="status != null">AND STATUS = #{status}</if>
</where>
</select>
#{paramName} 取值,test="paramName != null" 判斷**不加 #{}**List<Airline> findAll(Map<String, Object> params);
public List<Airline> findAll(PageInfo page, Airline airline) {
Map<String, Object> params = new HashMap<>();
params.put("page", page);
params.put("airline", airline);
return airlineMapper.findAll(params);
}
<select id="findAll" resultMap="BaseResultMap" parameterType="java.util.Map">
SELECT ...
<where>
<if test="airline.departureAirport != null">...</if>
</where>
<if test="page.sortName != null">
ORDER BY ${fileders[page.sortName]} ${page.sortOrder}
</if>
</select>
public class AirlineQuery {
private String departureAirport;
private String arrivalAirport;
private BigDecimal status;
private PageInfo page;
// getter/setter
}
List<Airline> findAll(AirlineQuery query);
<select id="findAll" resultMap="BaseResultMap" parameterType="com.xxx.AirlineQuery">
SELECT ...
<where>
<if test="departureAirport != null">...</if>
</where>
</select>
| 維度 | @Param | Map | JavaBean |
|---|---|---|---|
| 類型安全 | ✅ 高 | ❌ 低 | ✅ 高 |
| 接口清晰度 | ✅ 高 | ❌ 低 | ✅ 高 |
| 參數靈活性 | 中 (固定簽名) | ✅ 極高 | 中 (需修改類) |
| 重構友好 | ✅ | ❌ | ✅ |
| 適用場景 | 2-5 參數、穩定接口 | 動態查詢、報表、舊系統 | 複雜查詢、長期維護項目 |
List<User> search(@Param("keyword") String keyword, @Param("page") PageRequest page);
// 接口
List<User> findByIds(@Param("ids") List<Long> ids);
// XML
WHERE id IN (<foreach collection="ids" item="id" separator=",">#{id}</foreach>)
@Select("SELECT * FROM user WHERE name = #{name} AND age > #{age}")
User findByNameAndAge(@Param("name") String name, @Param("age") int age);
@Param,保持一致性departureAirport vs DEPARTURE_AIRPORT)MyBatis 多參數傳遞本質是參數名綁定。**@Param 註解**通過顯式命名實現接口與 XML 解耦,是大多數場景的最優解。**JavaBean**適合複雜業務參數封裝,**Map**作為過渡或動態場景補充。統一團隊規範,避免混用導致維護混亂。