从 Java 将查询作为 SQL 开发人员脚本运行并保存脚本的输出



我的数据库里有一张桌子。我想使用 JAVAibatis 将其作为.csv文件获取。

我知道使用 SQL 开发人员客户端执行此操作的一种快速方法是编写以下查询:

select /*csv*/* from employees

并将其作为脚本在 SQL 开发人员客户端执行。(如图所示)
我认为com.ibatis.common.jdbc.ScriptRunner可能适合我的需求,但找不到将脚本的输出捕获到.csv文件中的方法。

甚至可以从 JAVA 执行上述查询吗?

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

谢谢。

请参考此处的链接以使用弹簧批次。

您可以使用下面的项目阅读器和项目编写器

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

并且您需要配置会话工厂。

到目前为止,我发现的最好的方法是发送查询:

SELECT EMP_NAME||', '|| EMP_LAST ||', '|| FROM EMP_TABLE地图文件:

<select id="testing" resultClass="java.lang.String">  
    SELECT EMP_NAME||', '|| EMP_LAST ||', '|| FROM EMP_TABLE  
 </select>

查询将返回分析的字符串作为结果。

"乔,史密斯,1000"戴夫,德文郡,1300年"..."佐伊,辛瑟,900"

我尝试了两种方法:
1. 行处理程序:

 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. 查询列表:

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

结果是:

带行处理程序:2242707000带列表:2455066000行处理程序的速度更快:448629000(50K 条目 7MB csv 文件大约需要 0.44 秒。

如果有人知道更快的方法,我很乐意测试它,并发布结果。

最新更新