首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> DB2 資料庫 >> DB2 教學

MyBatis 多參數與列表查詢:四種參數傳遞方式完整對比

     編輯:DB2 教學

場景:員工資料查詢

表結構:t_employeer(employeer_id, employeer_name, employeer_age, employeer_department, employeer_worktype)

基礎:列表查詢返回 List

ResultMap 定義

<resultMap type="Employeer" id="resultMap">
    <id property="employeerId" column="employeer_id"/>
    <result property="employeerName" column="employeer_name"/>
    <result property="employeerAge" column="employeer_age"/>
    <result property="employeerDepartment" column="employeer_department"/>
    <result property="employeerWorktype" column="employeer_worktype"/>
</resultMap>

查詢語句

<select id="findEmployeerByName" parameterType="string" resultMap="resultMap">
    SELECT * FROM t_employeer WHERE employeer_name LIKE #{employeerName}
</select>

Mapper 介面

List<Employeer> findEmployeerByName(String employeerName);

多參數查詢四種寫法

方式一:索引佔位符 #{0}, #{1}

// Mapper
List<Employeer> findByNameAndDep(String name, String dep);

// XML
<select id="findByNameAndDep" resultMap="resultMap">
    SELECT * FROM t_employeer 
    WHERE employeer_name = #{0} AND employeer_department = #{1}
</select>

缺點:參數順序耦合,可讀性差,易出錯。

方式二:@Param 註解(推薦)

// Mapper
List<Employeer> findByNameAndDep(@Param("name") String name, @Param("dep") String dep);

// XML
<select id="findByNameAndDep" resultMap="resultMap">
    SELECT * FROM t_employeer 
    WHERE employeer_name = #{name} AND employeer_department = #{dep}
</select>

優點:參數名語意化,順序不敏感,官方推薦做法。

方式三:Map 封裝

// Mapper
List<Employeer> findByMap(Map<String, String> params);

// XML
<select id="findByMap" parameterType="map" resultMap="resultMap">
    SELECT * FROM t_employeer 
    WHERE employeer_name = #{key1} AND employeer_department = #{key2}
</select>
// 呼叫端
Map<String, String> map = new HashMap<>();
map.put("key1", "明明");
map.put("key2", "財會部");
List<Employeer> list = mapper.findByMap(map);

適用:動態參數數量、通用查詢服務。

方式四:POJO 封裝(最佳實踐)

// 參數物件
public class EmployeerQuery {
    private String name;
    private String department;
    // Getter/Setter
}

// Mapper
List<Employeer> findByQuery(EmployeerQuery query);

// XML
<select id="findByQuery" parameterType="EmployeerQuery" resultMap="resultMap">
    SELECT * FROM t_employeer 
    WHERE employeer_name = #{name} AND employeer_department = #{department}
</select>

優點:型別安全、IDE 支援重構、文檔化、易擴展。

resultType vs resultMap

  • resultType:簡單查詢,欄位名與屬性名一致時自動映射
  • resultMap:複雜映射(關聯、別名、型別轉換、建構子注入)
  • 兩者不可同時存在於同一 <select>

測試驗證結果

列表查詢結果

多參數查詢結果

Map封裝查詢結果

總結建議

場景推薦方式理由
固定 1-2 參數@Param清晰、解耦順序
動態/可變參數Map靈活通用
固定多參數、長期維護POJO型別安全、可擴展、文檔化
避免使用索引佔位符脆弱、不可讀
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved