我的数据库中有一张表。我想使用JAVA
和ibatis
将其作为.csv文件获取。
我知道使用SQL Developer客户端的快速方法是编写以下查询:
select /*csv*/* from employees
并在SQL Developer客户端上将其作为脚本执行。 (如图所示here)
我认为com.ibatis.common.jdbc.ScriptRunner
可能符合我的需要,但无法找到将脚本输出捕获到.csv文件的方法。
甚至可以从JAVA执行上面的查询吗?
有更快的方法吗? (发送选择查询并解析其结果对我来说不是一个选项。)
感谢。
答案 0 :(得分:0)
请参阅链接 here以使用春季批次。
您可以使用以下项目阅读器和项目编写器
<bean id="pageReader" class="org.mybatis.spring.batch.MyBatisPagingItemReader" scope="step">
<property name="sqlSessionFactory" ref="sqlSessionFactory" />
<property name="queryId" value="getEmployee" />
<property name="pageSize" value="1000" />
</bean>
<mapper namespace="com.kp.db.persistence.IEmpTableMapper">
<select id="getEmployee" parameterType="EmpFieldMap">
SELECT EMP_NAME, EMP_LAST FROM EMP_TABLE
</select>
</mapper>
<bean id="cvsFileItemWriter" class="org.springframework.batch.item.file.FlatFileItemWriter" scope="step">
<!-- write to this csv file -->
<property name="resource" value="#{jobParameters['fileName']}" />
<property name="shouldDeleteIfExists" value="true" />
<property name="lineAggregator">
<bean
class="org.springframework.batch.item.file.transform.DelimitedLineAggregator">
<property name="delimiter" value="," />
<property name="fieldExtractor">
<bean
class="org.springframework.batch.item.file.transform.BeanWrapperFieldExtractor">
<property name="names" value="empFirst, empLast" />
</bean>
</property>
</bean>
</property>
<property name="headerCallback" ref="empHeader" />
</bean>
您需要配置会话工厂。
答案 1 :(得分:0)
到目前为止,我发现的最好的方法是发送查询:
SELECT EMP_NAME||', '|| EMP_LAST ||', '|| FROM EMP_TABLE
地图文件:
<select id="testing" resultClass="java.lang.String">
SELECT EMP_NAME||', '|| EMP_LAST ||', '|| FROM EMP_TABLE
</select>
查询将返回已解析的字符串作为结果。
"Joe, Smith , 1000" "Dave, Devon , 1300" ... "Zoee, Zinther , 900"
我尝试了两种方法:
1. rowHandler:
long started1 = System.nanoTime();
SelectToFile selectToFileRowHandler = new SelectToFile("test1.csv");
sqlMap.queryWithRowHandler("map.testing", selectToFileRowHandler);
long time1 = (System.nanoTime()-started1);
System.out.println("with row handler: " + time1);
2. queryForList:
long started2 = System.nanoTime();
@SuppressWarnings("unchecked")
List<String> lst = (List<String>)sqlMap.queryForList("map.testing");
BufferedWriter bw = new BufferedWriter(new FileWriter("test2.csv"));
for(String str : lst){
bw.write(str);
}
long time2 = (System.nanoTime()-started2);
System.out.println("with list: " + time2);
结果是:
with row handler: 2242707000 with list: 2455066000 rowhandler was faster by: 448629000 (approx 0.44 sec for 50K entries 7MB csv file.)
如果有人知道更快的方式,我会很乐意测试它,然后发布结果。