
MyBatis 中 @ResultType 注解的正确使用方法
本文探讨 MyBatis 中 @ResultType 注解的用法,并澄清其与 ResultHandler 的关系。 源码分析显示,@ResultType 注解仅在方法返回类型为 void 时生效。
误区与澄清:
许多开发者误认为 @ResultType 直接指定返回值类型。 实际上,当方法返回 void 时,@ResultType 告知 MyBatis 如何将查询结果映射到指定类型 (Student.class),这通常配合 ResultHandler 使用。 如果方法返回非 void 类型,@ResultType 将被忽略,MyBatis 会根据方法返回类型进行映射。
正确使用方法:
以下示例展示了 @ResultType 与 ResultHandler 的正确结合:
@Select("select * from student")
@ResultType(Student.class)
void queryStudent(StudentResultHandler resultHandler);
public class StudentResultHandler implements ResultHandler {
private final List students = new ArrayList<>();
@Override
public void handleResult(ResultContext extends Student> context) {
Student student = context.getResultObject();
students.add(student);
}
public List getStudents() {
return students;
}
}
在这个例子中:
-
queryStudent方法返回void。 -
@ResultType(Student.class)告知 MyBatis 将查询结果映射为Student对象。 -
StudentResultHandler实现ResultHandler接口,逐行处理查询结果,并将每个Student对象添加到students列表中。 - 调用者需要通过
resultHandler.getStudents()获取结果列表。
其他情况:
-
@ResultMap注解: 如果使用了 XML 映射文件中的定义结果映射,则应该使用@ResultMap注解,而不是@ResultType。 -
非
void返回类型: 如果方法返回List或Student,则无需@ResultType,MyBatis 会自动根据返回类型进行映射。
总结:
@ResultType 注解主要用于 void 返回类型的方法,配合 ResultHandler 实现自定义结果处理逻辑。 对于非 void 返回类型,MyBatis 会根据返回类型自动进行映射,无需 @ResultType。 选择 @ResultType 或 @ResultMap 取决于是否使用 XML 结果映射。 理解这些区别,才能正确有效地使用 MyBatis 注解。










