如何将 mybatis 选择查询的巨大结果集导出到 csv?
Posted
技术标签:
【中文标题】如何将 mybatis 选择查询的巨大结果集导出到 csv?【英文标题】:How to export huge result set of a mybatis select query to csv? 【发布时间】:2015-06-29 12:58:43 【问题描述】:使用 MyBatis,我从映射器中的选择查询中获得了接近 65,000 个结果。我想创建一个 csv 并将这些结果作为 zip 文件发送到 UI 调用,这将直接触发浏览器的下载对话框。
通过搜索,我了解到我们需要在这些场景中使用自定义结果处理程序。但是来自 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方法必须返回void。在此说明中,我有以下疑问。
在使用此 CSVExportRowHandler 类时,我只能将一条记录打印到控制台。其余记录发生了什么 (应该是 65k)?
有没有优化的方法?
如何直接触发浏览器的下载对话框?在此之前我需要将记录写入 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 还很陌生。
谢谢!!!!
【问题讨论】:
你在用spring吗? 【参考方案1】:sessionID 使您的代码过于复杂,jackoffID 也是如此。即使延迟加载(感谢 CGLib 代理)。然而,在讨论如何实现复杂查询时,它变得有点模糊
选择 id、名称、shortName、描述 从标签
【讨论】:
这是我的查询的答案吗?以上是关于如何将 mybatis 选择查询的巨大结果集导出到 csv?的主要内容,如果未能解决你的问题,请参考以下文章