【问题标题】:SQL query returning "oracle.jdbc.driver.OracleResultSetImpl@48f675" instead of my expected dataSQL 查询返回“oracle.jdbc.driver.OracleResultSetImpl@48f675”而不是我的预期数据
【发布时间】:2014-08-28 00:45:50
【问题描述】:

我已成功连接到我的数据库,但是当尝试使用 Java servlet 转发请求将 SQL 查询结果返回到我的 index.jsp 页面时,接收到“oracle.jdbc.driver.OracleResultSetImpl@48f675”的输出而不是预期的数据结果。 (注意:我在 Eclipse 的控制台视图中收到了来自我的 SQL 查询的预期结果;但是,我的 jsp 页面上并没有像我预期的那样显示数据。而是显示 ResultSetImp 消息。任何任何人都可以分享关于为什么我得到这个 ResultSetImp 而不是我的预期数据的见解将不胜感激。还有人愿意解释 ResultSetImp 的意思吗……我的搜索没有发现任何有用的东西,或者至少我理解. 代码如下:

package com.database;
import java.sql.*;


public class DBConnection {

public static void main(String[] args) 
throws ClassNotFoundException, SQLException{

}

    public static ResultSet queryExecute() throws ClassNotFoundException, SQLException
    {

    Class.forName("oracle.jdbc.OracleDriver");  
    Connection conn = DriverManager.getConnection("**Connection string here**");

    if (conn == null)
    {
        System.out.println("Database connection not successfull");
    }
    else 
    {
        System.out.println("Database connection success!");
        //System.out.println(conn);
    }


        Statement stmt = conn.createStatement();
        //ResultSet rs = stmt.executeQuery("SELECT COUNT(*) FROM Request natural join RequestTerm");
        ResultSet rs = stmt.executeQuery("select * from (select QIPNUMBER,model,SERIALNUMBER,YEAROFMFG,DATERECEIVED,TERM,DEALERNAME from Request natural join RequestTerm)WHERE ROWNUM <= 20");
        ResultSetMetaData rsmd = rs.getMetaData();
        int columnsNumber = rsmd.getColumnCount(); 
        //List<String> displayRecords = new ArrayList<String>(); try store result set into an array object


        while (rs.next()) {
            // Iterate through the data in the result set and display it. 

           //int count = rs.getInt(1);
          while (rs.next()) {
          //Print one row          
          for(int i = 1 ; i <= columnsNumber; i++){

                System.out.print(rs.getString(i) + " " + "    "); //Print one element of a row -- print vs println

          }

            System.out.println(); //Move to the next line to print the next row.  
            //System.out.println("Number of row:"+count);
              }
        }

    rs.close();
    stmt.close();
    conn.close();
    return rs;

    }

} 

我的 servlet 代码:

package com.srccodes.example;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.SQLException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

导入 com.database.DBConnection;

   /**
    * Servlet implementation class HelloWorld
    */
@WebServlet("/HelloWorld")
public class HelloWorld extends HttpServlet {
   public static final long serialVersionUID = 1L;

/**
 * @see HttpServlet#HttpServlet()
 */
  public HelloWorld() {
    super();
    // TODO Auto-generated constructor stub
}

/**
 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
 */
  public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

  response.setContentType("text/html");
  PrintWriter printWriter  = response.getWriter();
  printWriter.println("<h1>Hello from the doGet function!</h1>");
}


/**
 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
 */
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    try {
        //ResultSet display = DBConnection.queryExecute();
        request.setAttribute("display", DBConnection.queryExecute());
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    } catch (SQLException e) {
        e.printStackTrace();
    }
    request.getRequestDispatcher("/index.jsp").forward(request, response);

    /*String nextJSP = "/result.jsp";
    RequestDispatcher dispatcher = getServletContext().getRequestDispatcher(nextJSP);
    dispatcher.forward(request,response);*/
}

}

最后是我用来在 index.jsp 中调用我的 servlet 的语句:

我知道这个声明是一个脚本并且是不赞成的;但是,我正在尝试先将数据填充到我的 jsp 中,然后再从那里移动。

【问题讨论】:

  • 因为您正在打印对对象 (ResultSet) 的引用。返回结果集对象不会神奇地打印结果。您必须调用对象上的方法来迭代并获取值。
  • 感谢您的快速回复和帮助。所以我可以在我的类 DBConnection() 中创建一个方法来完成这个。数据是怎么打印到控制台的?
  • @user3812592 我在下面的回答中添加了您要询问的方法

标签: java sql jsp servlets jdbc-odbc


【解决方案1】:

当您返回 ResultSet 的对象时,您将获得相同的引用。你不会得到你想要的值。

你必须这样做(如果你真的想使用 scriplet):

<%
ResultSet rs = (ResultSet)request.getAttribute("display");

ResultSetMetaData rsmd = rs.getMetaData();
        int columnsNumber = rsmd.getColumnCount(); 

        while (rs.next()) {

          for(int i = 1 ; i <= columnsNumber; i++){
                out.print(rs.getString(i) + " " + "    " + "<br/>");
          }

            out.print("<br/>"); //Move to the next line to print the next row.  
            }
        }

    rs.close();
%>

更合适的方法是使用 bean:

class MyBean {
 int QIPNUMBER;
 String model;
 .....
 //getters and setters


}

现在在您的类中创建 MyBean 列表并填充对象,一个 Row = 一个对象。

List<MyBean> lst = new ArrayList<MyBean>();
MyBean myBean;
while (rs.next()) {
          myBean = new MyBean();
          myBean.setModel(rs.getString("model"));
          ....
          lst.add(myBean);
}
.....

return lst;

在此之后添加列表以在 Servlet 中请求而不是结果集。

request.setAttribute("display", DBConnection.queryExecute());
// queryExecute now returns List<MyBean>

如果你想在你的 JSP 中使用 scriplet,那么:

<%
   List<MyBean> lst = (ArrayList<MyBean>)request.getAttribute("display");
   for(MyBean mb : lst){
       out.print(mb.getModel() + "<br/>");
       .....
   }
%>

【讨论】:

    【解决方案2】:

    您正在将 ResultSet 的实例传回 JSP:

    http://docs.oracle.com/javase/7/docs/api/java/sql/ResultSet.html

    当您使用 Oracle 时,返回的是 ResultSet 接口的 Oracle 实现,即 oracle.jdbc.driver.OracleResultSetImpl

    您的 JSP 代码只是调用 oracle.jdbc.driver.OracleResultSetImpl 对象的 toString 方法,因为它没有被覆盖,所以只是调用 java.lang.Object 类中的 toString 版本 - 这解释了输出:

    oracle.jdbc.driver.OracleResultSetImpl@48f675

    您需要从 ResultSet 对象中提取必要的值并相应地返回它们。请参阅这篇文章,了解如何做到这一点:

    http://docs.oracle.com/javase/tutorial/jdbc/basics/retrieving.html

    【讨论】:

      猜你喜欢
      • 2015-04-09
      • 1970-01-01
      • 2023-03-23
      • 2018-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-29
      相关资源
      最近更新 更多