首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

MyBatis 參數傳遞全攻略:從基本類型到複雜對象

     編輯:Java 相關知識

參數類型分類

MyBatis parameterType 支持兩大類:

  • 基本類型:int、String、Date 等,單參數傳遞,用 #{參數名} 獲取
  • 複雜類型:Java 實體類、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);

優勢:封裝多條件查詢參數,代碼可讀性強。

模式三:Map 多參數靈活傳遞

<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);

模式四:@Param 註解多參數(推薦)

// 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 值。

進階場景:集合參數與動態 SQL

List 集合批量操作

// 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"。

多參數封裝 Map 自定義 Key

// 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);

foreach 屬性完整解析

屬性說明示例值
collection要迭代的集合(必填,值取決於參數類型)list / array / map的key
item迭代元素別名item / logid / id
index索引別名(List為索引,Map為Key)index
open起始字符串(
separator分隔符,
close結束字符串)

最佳實踐建議

  1. 優先使用 @Param:參數≤5個時,接口清晰,XML 可讀性高
  2. 複雜查詢用實體/Map:條件多、可選參數多時,封裝對象避免接口膨脹
  3. 集合參數明確 collection:單參數 List 用 list、數組用 array、多參數自定義 Key
  4. 類型安全:#{item, jdbcType=INTEGER} 顯式指定 JDBC 類型,防止類型推斷錯誤
  5. 防止 SQL 注入:始終用 #{} 而非 ${},後者為字符串直接拼接

總結

MyBatis 參數傳遞靈活多樣,核心在於理解參數如何被封裝為 Map。單參數自動包裝,多參數需 @Param 指定 Key,集合參數注意 collection 屬性對應關係。掌握這些規則,能輕鬆應對各類複雜 SQL 參數綁定場景。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved