mybatis 中 @ResultType 注解的正確使用方法
本文探討 MyBatis 中 @ResultType 注解的用法,并澄清其與 ResultHandler 的關系。 源碼分析顯示,@ResultType 注解僅在方法返回類型為 void 時生效。
誤區(qū)與澄清:
許多開發(fā)者誤認為 @ResultType 直接指定返回值類型。 實際上,當方法返回 void 時,@ResultType 告知 MyBatis 如何將查詢結果映射到指定類型 (Student.class),這通常配合 ResultHandler 使用。 如果方法返回非 void 類型,@ResultType 將被忽略,MyBatis 會根據(jù)方法返回類型進行映射。
正確使用方法:
以下示例展示了 @ResultType 與 ResultHandler 的正確結合:
@Select("select * from student") @ResultType(Student.class) void queryStudent(StudentResultHandler resultHandler); public class StudentResultHandler implements ResultHandler<Student> { private final List<Student> students = new ArrayList<>(); @Override public void handleResult(ResultContext<? extends Student> context) { Student student = context.getResultObject(); students.add(student); } public List<Student> getStudents() { return students; } }
在這個例子中:
- queryStudent 方法返回 void。
- @ResultType(Student.class) 告知 MyBatis 將查詢結果映射為 Student 對象。
- StudentResultHandler 實現(xiàn) ResultHandler 接口,逐行處理查詢結果,并將每個 Student 對象添加到 students 列表中。
- 調(diào)用者需要通過 resultHandler.getStudents() 獲取結果列表。
其他情況:
-
@ResultMap 注解: 如果使用了 xml 映射文件中的
定義結果映射,則應該使用 @ResultMap 注解,而不是 @ResultType。 -
非 void 返回類型: 如果方法返回 List
或 Student,則無需 @ResultType,MyBatis 會自動根據(jù)返回類型進行映射。
總結:
@ResultType 注解主要用于 void 返回類型的方法,配合 ResultHandler 實現(xiàn)自定義結果處理邏輯。 對于非 void 返回類型,MyBatis 會根據(jù)返回類型自動進行映射,無需 @ResultType。 選擇 @ResultType 或 @ResultMap 取決于是否使用 XML 結果映射。 理解這些區(qū)別,才能正確有效地使用 MyBatis 注解。