Используя MyBatis, я получаю около 65 000 результатов из запроса select внутри mapper. Я хочу создать csv и отправить эти результаты в виде zip-файла в UI-вызов, который вызовет диалог загрузки непосредственно из браузера.Как экспортировать огромный набор результатов запроса mybatis select в csv?
При поиске я понял, что нам нужно использовать пользовательский обработчик результатов в этих сценариях. Но ссылка на пример из ibatis, кажется, удалена http://code.google.com/p/mybatis/wiki/ResultHandlerExample, не оставляя никаких точных шагов для использования или реализации.
Однако, я попробовал как показано ниже.
public class CSVExportRowHandler implements ResultHandler {
@SuppressWarnings("unchecked")
@Override
public void handleResult(ResultContext context) {
SRDContainer srdContainer = (SRDContainer) context.getResultObject();
System.out.println("Container: " + srdContainer.toString() + ", " + context.getResultCount() +", "+ context.isStopped());
for (StudentResultDetails srd : srdContainer.getStudentResultDetails()){
System.out.println("result: " + srd.getStudentName());
}
}
}
Поскольку метод handleResult должен возвращать пустоту. В этой заметке у меня есть следующие запросы.
Я могу печатать на консоли только один рекорд на использовании этого класса CSVExportRowHandler. Что случилось с остальными записями (должно было быть 65 тыс.)?
Есть ли оптимизированный способ сделать это?
Как запустить диалог загрузки браузера напрямую? перед этим мне нужно записать записи в csv или я могу передать результаты для загрузки?
Вот мой DAO и сервис JAX-RS для справки
DAO.java
public void exportSRD(HashMap<String, Object> params) {
SqlSession sqlSession = SessionFactory.getSession().openSession();
try {
CSVExportRowHandler handler = new CSVExportRowHandler();
sqlSession.select("getAssignmentSRDSession", params, handler);
} finally {
sqlSession.close();
}
}
Услуги:
@Path("/{reportType}/studentresultdetails/{function}/{sessionId}")
@GET
public void exportOrPrintUtil(@PathParam("reportType") String reportType, @PathParam("function") String function, @QueryParam("pageNum") Integer pageNum,
@QueryParam("pageSize") Integer pageSize, @QueryParam("sortOn") String sortOn, @QueryParam("sortOrder") String sortOrder,
@QueryParam("filterByName") String filterByName, @PathParam("sessionId") Integer sessionId) throws IOException {
HashMap<String, Object> params = new HashMap<String, Object>();
Object enableSort;
Object enablePrintOrExportFlag;
params.put("sessionId", sessionId);
params.put("enableSort", false);
params.put("enablePrintOrExportFlag", true);
params.put("filterByName", filterByName);
dao.exportSRD(params);
*********** WHAT TO BE RETURNED AS THE ABOVE dao.exportSRD(params) RETURNS VOID. HOW TO TRIGGER DOWNLOAD DIALOG FROM HERE. *****************
}
SRDContainer.java объект
@XmlRootElement
public class SRDContainer implements Comparable<SRDContainer> {
private List<StudentResultDetails> studentResultDetails;
public SRDContainer() {}
public SRDContainer(
List<StudentResultDetails> studentResultDetails) {
super();
this.studentResultDetails = studentResultDetails;
}
public List<StudentResultDetails> getStudentResultDetails() {
return studentResultDetails;
}
public void setStudentResultDetails(
List<StudentResultDetails> studentResultDetails) {
this.studentResultDetails = studentResultDetails;
}
@Override
public int compareTo(SRDContainer o) {
return 0;
}
@Override
public String toString() {
return "SRDContainer [studentResultDetails="
+ studentResultDetails + "]";
}
public List<String[]> toStringArrayList() {
String[] array = new String[studentResultDetails.size()];
List<String[]> stringArrayListOut = new ArrayList<String[]>();
int index = 0;
for (StudentResultDetails value : this.studentResultDetails) {
array[index] = value.toFlatCSVString();
index++;
}
stringArrayListOut.add(array);
return stringArrayListOut;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime
* result
+ ((studentResultDetails == null) ? 0 : studentResultDetails
.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
SRDContainer other = (SRDContainer) obj;
if (studentResultDetails == null) {
if (other.studentResultDetails != null)
return false;
} else if (!studentResultDetails.equals(other.studentResultDetails))
return false;
return true;
}
}
Я довольно новыми для JAX-RS и mybatis.
Спасибо !!!!
Вы используете весной? –
No @KarthikPrasad –
Я использую MyBatis –