Mapper中的方法執行時會構造為org.apache.ibatis.binding.MapperMethod$MethodSignature對象,從該類源碼中可以了解如何使用Mapper方法。
【支持的特殊參數類型】
RowBounds、ResultHandler、普通參數 (作為sql執行時使用的變量)
其中普通參數可以是單一的model、查詢條件的map或直接將一到多個查詢條件作為參數(多個條件在框架中最終將封裝為Map<String, Object>使用)
另外普通參數支持添加@Param注解以修改參數名,如不修改則參數名用0、1、2來表示。
使用時,如參數有多個則只能使用0和param1這兩種形式。(如:SELECT * FROM TABLE WHERE COLUMN=#{0})
相關源碼:
public Object convertArgsToSqlCommandParam(Object[] args) { final int paramCount = params.size(); if (args == null || paramCount == 0) { return null; } else if (!hasNamedParameters && paramCount == 1) { return args[params.keySet().iterator().next()]; } else { final Map<String, Object> param = new ParamMap<Object>(); int i = 0; for (Map.Entry<Integer, String> entry : params.entrySet()) { param.put(entry.getValue(), args[entry.getKey()]); // issue #71, add param names as param1, param2...but ensure backward compatibility final String genericParamName = "param" + String.valueOf(i + 1); if (!param.containsKey(genericParamName)) { param.put(genericParamName, args[entry.getKey()]); } i++; } return param; } }
【支持的返回類型】
Model類型、void、集合、數組皆可
需注意的是如果返回類型為map則需添加注解@MapKey(不加MethodSignature類中returnsMap屬性會被設為false,其他后果未驗證)
【在SelectProvider中修改參數】
Mybatis框架進入SelectProvider在前述convertArgsToSqlCommandParam方法之后,最終執行sql之前,因此可以在此處對最終執行sql的參數進行修改(前提是不能修改參數引用)。如使用參數Map<String, Object>的形式,就更可以靈活地進行修改。
注:多個參數必須使用Map接收,單個參數可以使用原有類型接收也可以使用Map接收。