2015-04-22 2 views
2

Используя 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 должен возвращать пустоту. В этой заметке у меня есть следующие запросы.

  1. Я могу печатать на консоли только один рекорд на использовании этого класса CSVExportRowHandler. Что случилось с остальными записями (должно было быть 65 тыс.)?

  2. Есть ли оптимизированный способ сделать это?

  3. Как запустить диалог загрузки браузера напрямую? перед этим мне нужно записать записи в 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.

Спасибо !!!!

+0

Вы используете весной? –

+0

No @KarthikPrasad –

+0

Я использую MyBatis –

ответ

-2

sessionID сделать ваш код слишком сложным, jackoffID также. даже с отложенной загрузкой (благодаря прокси CGLib). Он получает только немного нечетким, однако, при обсуждении, как реализовать сложные запросы

выберите идентификатор, имя, сокращенный, описание из тега

+0

Будет ли это решить проблему? Пожалуйста, добавьте больше объяснений. – Nilambar

+0

это ответ на мой запрос? –

Смежные вопросы