在 MyBatis 中,分頁查詢的結果可以通過攔截器(Interceptor)或者 ResultHandler 進行二次處理。這里我將為你介紹兩種方法:
首先,創建一個自定義攔截器,實現 org.apache.ibatis.plugin.Interceptor
接口。在這個攔截器中,你可以對查詢結果進行二次處理。例如:
import org.apache.ibatis.executor.resultset.ResultSetHandler;
import org.apache.ibatis.plugin.*;
import java.sql.Statement;
import java.util.List;
@Intercepts({
@Signature(type = ResultSetHandler.class, method = "handleResultSets", args = {Statement.class})
})
public class CustomInterceptor implements Interceptor {
@Override
public Object intercept(Invocation invocation) throws Throwable {
// 獲取查詢結果
List<Object> resultList = (List<Object>) invocation.proceed();
// 對查詢結果進行二次處理
for (Object obj : resultList) {
// 在這里進行你的二次處理邏輯
}
return resultList;
}
@Override
public Object plugin(Object target) {
if (target instanceof ResultSetHandler) {
return Plugin.wrap(target, this);
} else {
return target;
}
}
@Override
public void setProperties(Properties properties) {
}
}
然后,在 MyBatis 配置文件中注冊這個攔截器:
<!-- ... -->
<plugins>
<plugin interceptor="com.example.CustomInterceptor"/>
</plugins>
<!-- ... -->
</configuration>
ResultHandler 是一個處理查詢結果的回調接口。你可以實現這個接口,并在 handleResult
方法中對查詢結果進行二次處理。例如:
import org.apache.ibatis.session.ResultContext;
import org.apache.ibatis.session.ResultHandler;
public class CustomResultHandler implements ResultHandler {
@Override
public void handleResult(ResultContext resultContext) {
// 獲取查詢結果
Object obj = resultContext.getResultObject();
// 對查詢結果進行二次處理
// 在這里進行你的二次處理邏輯
}
}
在你的代碼中,使用 SqlSession
執行查詢時,傳入自定義的 ResultHandler
:
try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
CustomResultHandler resultHandler = new CustomResultHandler();
sqlSession.select("yourMapperNamespace.yourSelectMethod", resultHandler);
}
這樣,在查詢結果返回之前,你可以在 CustomResultHandler
的 handleResult
方法中對查詢結果進行二次處理。