Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 获取多行期间使用SpringJDBCTemplate的csv输出_Java_Spring_Csv_Spring Jdbc - Fatal编程技术网

Java 获取多行期间使用SpringJDBCTemplate的csv输出

Java 获取多行期间使用SpringJDBCTemplate的csv输出,java,spring,csv,spring-jdbc,Java,Spring,Csv,Spring Jdbc,我正在使用SpringJDBCTemplate与Oracle数据库交互。 为了获取给定条件下的多行,我希望将结果存储在以列名为标题的csv文件中 我尝试了几种方法- List List=jdbcTemplate.query('query','parameters',customizedrowmapper) 在customizedrowmapper中,我从结果集中获取行,并在Bean类中设置字段。我找不到任何简单的方法将bean转换为csv文件。因为我没有访问bean类代码的权限 我发现的第二种方

我正在使用SpringJDBCTemplate与Oracle数据库交互。 为了获取给定条件下的多行,我希望将结果存储在以列名为标题的csv文件中

我尝试了几种方法-

List List=jdbcTemplate.query('query','parameters',customizedrowmapper)

在customizedrowmapper中,我从结果集中获取行,并在Bean类中设置字段。我找不到任何简单的方法将bean转换为csv文件。因为我没有访问bean类代码的权限

我发现的第二种方法是使用opencsv库将结果集直接写入csv文件,如下所示

CSVWriter wr=new CSVWriter(new FileWriter(“Report.csv”),,);
wr.writeAll(rs,true);
wr.flush();
wr.close()

这工作正常,但在写入csv时跳过了一行。我试着问了几个问题。手动,我可以在结果中看到4行,但在CSV中,它只存储3行。有人面临类似的问题吗


或者任何其他方法都可以实现同样的效果,而无需手动从ResultSet获取每条记录,并将其设置为逗号分隔的字符串并存储在文件中。

请注意,当jdbcTemplate将ResultSet传递给RowCallbackHandler或映射器时,它已定位在第一条记录上(已调用rs.next())。CSVWriter在处理任何记录之前再次调用rs.next(),所以不会写入第一条记录。 您需要自己编写数据,例如:

    public class CustomRowCallbackHandler implements RowCallbackHandler {
    @Override
    public void processRow(ResultSet rs) throws SQLException {
        try {
            CSVWriter w = new CSVWriter(new FileWriter("Report.csv"), ',');
            int columnCount = rs.getMetaData().getColumnCount();
            //Write column names
            String[] ssn = new String[columnCount];
            for(int i = 1; i < columnCount; i++){
                ssn[i - 1] = rs.getMetaData().getColumnName(i);
            }
            w.writeNext(ssn);
            //Write data
            do{
                String[] ss = new String[columnCount];
                for(int i = 1; i < columnCount; i++){
                    ss[i - 1] = rs.getString(i);
                }
                w.writeNext(ss);
            }while(rs.next());
            w.flush();
            w.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
public类CustomRowCallbackHandler实现RowCallbackHandler{
@凌驾
public void processRow(结果集rs)引发SQLException{
试一试{
CSVWriter w=新的CSVWriter(新的文件编写器(“Report.csv”),',';
int columnCount=rs.getMetaData().getColumnCount();
//写列名
字符串[]ssn=新字符串[columnCount];
对于(int i=1;i

希望能有帮助

此代码保存查询结果并将其作为csv文件返回(您可以使用endpoint下载)。但若您不需要将其返回给控制器中的用户,那个么将所有数据转发到FileOutputStream就很容易了

import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.ResultSetExtractor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;

@RestController
@RequestMapping("/api/report")
public class UserReportController {
    private JdbcTemplate jdbcTemplate;

    public UserReportController(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

    private static String ALL_USERS_QUERY = "select * from users";

    @GetMapping("/all-users")
    public void allUsers(HttpServletResponse response) throws IOException {
        response.setContentType("text/csv");
        jdbcTemplate.query(ALL_USERS_QUERY, new StreamingCsvResultSetExtractor(response.getOutputStream()));
    }


    class StreamingCsvResultSetExtractor
        implements ResultSetExtractor<Void> {

        private char DELIMITER = ',';

        private final OutputStream os;

        
        public StreamingCsvResultSetExtractor(final OutputStream os) {
            this.os = os;
        }

        @Override
        public Void extractData(final ResultSet rs) {
            try (PrintWriter pw = new PrintWriter(os, true)) {
                final ResultSetMetaData rsmd = rs.getMetaData();
                final int columnCount = rsmd.getColumnCount();
                writeHeader(rsmd, columnCount, pw);
                while (rs.next()) {
                    for (int i = 1; i <= columnCount; i++) {
                        final Object value = rs.getObject(i);
                        String strValue = value == null ? "" : value.toString();
                        pw.write(strValue.contains(",") ? "\"" + strValue+ "\"" : strValue);
                        if (i != columnCount) {
                            pw.append(DELIMITER);
                        }
                    }
                    pw.println();
                }
                pw.flush();
            } catch (final SQLException e) {
                throw new RuntimeException(e);
            }
            return null;
        }

        private void writeHeader(final ResultSetMetaData rsmd,
                                 final int columnCount, final PrintWriter pw) throws SQLException {
            for (int i = 1; i <= columnCount; i++) {
                pw.write(rsmd.getColumnName(i));
                if (i != columnCount) {
                    pw.append(DELIMITER);
                }
            }
            pw.println();
        }
    }

}
导入org.springframework.jdbc.core.jdbc模板;
导入org.springframework.jdbc.core.ResultSetExtractor;
导入org.springframework.web.bind.annotation.GetMapping;
导入org.springframework.web.bind.annotation.RequestMapping;
导入org.springframework.web.bind.annotation.RequestParam;
导入org.springframework.web.bind.annotation.RestController;
导入javax.servlet.http.HttpServletResponse;
导入java.io.IOException;
导入java.io.OutputStream;
导入java.io.PrintWriter;
导入java.sql.ResultSet;
导入java.sql.ResultSetMetaData;
导入java.sql.SQLException;
@RestController
@请求映射(“/api/report”)
公共类UserReportController{
私有JdbcTemplate JdbcTemplate;
公共UserReportController(JdbcTemplate JdbcTemplate){
this.jdbcTemplate=jdbcTemplate;
}
私有静态字符串所有用户\u QUERY=“选择*来自用户”;
@GetMapping(“/所有用户”)
public void allUsers(HttpServletResponse响应)引发IOException{
response.setContentType(“text/csv”);
query(所有用户查询,新的StreamingCsvResultSetExtractor(response.getOutputStream());
}
类StreamingCsvResultSetExtractor
实现ResultTextRactor{
专用字符分隔符=',';
私有最终输出流;
公共流化CSVRESultSetExtractor(最终输出流操作系统){
this.os=os;
}
@凌驾
公共数据(最终结果集rs){
try(PrintWriter pw=新的PrintWriter(os,true)){
最终结果setMetadata rsmd=rs.getMetaData();
final int columnCount=rsmd.getColumnCount();
写头(rsmd、columnCount、pw);
while(rs.next()){
对于(int i=1;i