2014-01-13 70 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