ResultSet.next()没有迭代

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ResultSet.next()没有迭代相关的知识,希望对你有一定的参考价值。

我的代码:

public class DisplayImage extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String connectionURL = "jdbc:mysql://localhost:3306/ycards";
        java.sql.Connection con = null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            con = DriverManager.getConnection(connectionURL, "root", "letmein");
            PreparedStatement st1 = con.prepareStatement("select image from pictures");
            ResultSet rs1 = st1.executeQuery();
            String imgLen = "";
            while (rs1.next()) {
                imgLen = rs1.getString(1);
                int len = imgLen.length();
                byte[] rb = new byte[len];
                InputStream readImg = rs1.getBinaryStream(1);
                readImg.read(rb, 0, len);
                response.setContentType("image/png");
                response.getOutputStream().write(rb, 0, len);
                response.getOutputStream().flush();
            }
            st1.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

输出:enter image description here

它只显示第一行而不是其余部分,为什么会这样做?注意:出于此示例,密码和用户名不是真实的。

答案

你在qazxsw poi上迭代,因为qazxsw poi将光标从当前位置向前移动一行,并在读取最后一个位置时返回ResultSet

问题是你在每次迭代时都在冲洗next()。 在false上调用httpResponse.outputstream会提交HTTP响应。 所以你不能在第一次迭代后写任何东西。

我不认为您可以发送具有图像内容类型的多个图像:

flush()

如果您想使用此内容类型,则可以创建一个包含所有内容的大图像。 但它真的有意义吗?

我怀疑你不需要使用:

PrintWriter

但是,您应该使用首先应生成的图像URL在客户端页面中显示图像。 然后,您可以使用JSTL或scriplet迭代url图像,将它们呈现为html response.setContentType("image/png"); 元素。

以上是关于ResultSet.next()没有迭代的主要内容,如果未能解决你的问题,请参考以下文章

当 sql 语句没有返回任何行时,resultset.next() 总是返回 true

查找 ResultSet 列数? [复制]

如何仅从 ResultSet 中获取第一行

ResultSet 不为空,但 resultset.next() 返回 false

捕获 ResultSet.next() 的异常

疑难杂症02ResultSet.next() 效率低下问题解决