MyBatis parameterType 支持兩大類:
int、String、Date 等,單參數傳遞,用 #{參數名} 獲取Map,用 #{屬性名} 或 #{map的Key} 獲取<!-- Mapper XML -->
<select id="selectTeacher" parameterType="int" resultType="Teacher">
SELECT * FROM teacher WHERE class_id = #{id}
</select>
// Mapper 接口 List<Teacher> selectTeacher(int classId); // Service 調用 List<Teacher> list = teacherMapper.selectTeacher(2);
<select id="selectTeacher" parameterType="Teacher" resultType="Teacher">
SELECT * FROM teacher WHERE class_id = #{id}
</select>
Teacher query = new Teacher(); query.setId(2); List<Teacher> list = teacherMapper.selectTeacher(query);
優勢:封裝多條件查詢參數,代碼可讀性強。
<select id="selectTeacher" parameterType="Map" resultType="Teacher">
SELECT * FROM teacher WHERE class_id = #{id} AND sex = #{sex}
</select>
Map<String, Object> params = new HashMap<>();
params.put("id", "2");
params.put("sex", "男");
List<Teacher> list = teacherMapper.selectTeacher(params);
// Mapper 接口
List<Teacher> selectTeacher(@Param("id") String id, @Param("sex") String sex);
// XML 直接使用參數名
<select id="selectTeacher" resultType="Teacher">
SELECT * FROM teacher WHERE class_id = #{id} AND sex = #{sex}
</select>
// 調用簡潔
teacherMapper.selectTeacher("2", "男");
原理:MyBatis 將註解參數自動封裝為 Map<String, Object>,Key 為 @Param 值。
// Mapper 接口 void updateContactsIsRead(List<Integer> logIdList);
<update id="updateContactsIsRead">
UPDATE email_log SET is_read = 1
WHERE is_read = 0 AND log_id IN
<foreach collection="list" item="logid" open="(" close=")" separator=",">
#{logid, jdbcType=INTEGER}
</foreach>
</update>
關鍵點:單參數 List 時,collection="list" 固定寫法。
// Mapper 接口 List<Blog> dynamicForeach2Test(int[] ids);
<foreach collection="array" item="item" open="(" separator="," close=")">
#{item}
</foreach>
單參數數組用 collection="array"。
// Mapper 接口 List<Blog> dynamicForeach3Test(Map<String, Object> params);
<foreach collection="ids" item="item" ...> <!-- collection 對應 Map 的 Key -->
#{item}
</foreach>
// 調用構造
Map<String, Object> params = new HashMap<>();
params.put("ids", Arrays.asList(1,2,3,6,7,9));
params.put("title", "中國");
mapper.dynamicForeach3Test(params);
| 屬性 | 說明 | 示例值 |
|---|---|---|
| collection | 要迭代的集合(必填,值取決於參數類型) | list / array / map的key |
| item | 迭代元素別名 | item / logid / id |
| index | 索引別名(List為索引,Map為Key) | index |
| open | 起始字符串 | ( |
| separator | 分隔符 | , |
| close | 結束字符串 | ) |
list、數組用 array、多參數自定義 Key#{item, jdbcType=INTEGER} 顯式指定 JDBC 類型,防止類型推斷錯誤#{} 而非 ${},後者為字符串直接拼接MyBatis 參數傳遞靈活多樣,核心在於理解參數如何被封裝為 Map。單參數自動包裝,多參數需 @Param 指定 Key,集合參數注意 collection 屬性對應關係。掌握這些規則,能輕鬆應對各類複雜 SQL 參數綁定場景。