2014-01-13 44 views
0

我在我的db上有一个表。我想要使​​用JAVAibatis将其作为.csv文件获取。从java运行查询作为SQL Developer脚本并保存脚本的输出

我知道,一个快速的方法来做到这一点使用SQL Developer的客户端将编写以下查询:

select /*csv*/* from employees 

,并执行它作为SQL Developer的客户端脚本。 (如图所示here
我认为com.ibatis.common.jdbc.ScriptRunner可能适合我的需求,但无法找到将脚本输出捕获到.csv文件的方法。

是否有可能从JAVA执行上面的查询?

有没有更快的方法来做到这一点? (发送选择查询并解析其结果不是我的选项。)

谢谢。

回答

0

那么最好soution我发现迄今是将查询发送:
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" 

我试图2点的方法:
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.) 

如果有人知道更快的方法,我会高兴地测试它,并发布结果。

0

请参考链接 here使用春季批次。

您可以使用以下项目Reader和项目的作家

<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> 

而且你需要配置会话工厂。

+0

其实我试图做相反的事情,我试图将选择查询结果保存为.csv文件在本地。 – Roy

+0

更新了条目阅读器和条目编写器相应的 –

+0

谢谢,它是一个诀窍,但正如我所提到的“发送选择查询并解析其结果对我来说不是一种选择。”。我的问题是,如果有办法从oracle服务器接收结果并将其写入.csv文件,而客户端没有任何其他操作。 – Roy