如何使用java.sql从sql数据库中提取多个值?

如何使用java.sql从sql数据库中提取多个值?,java,sql,arrays,Java,Sql,Arrays,我有一个产品表,其中包含一个项目的产品编号和其他详细信息,还有一个包含产品编号、评级和审核的ReviewTable。因为一个项目可以有多个评分和评论,我需要检索该项目的所有评分和评论 "drop table ProductTable", // The product table "create table ProductTable ("+ "productNo Char(4)," + // Unique pr

我有一个产品表,其中包含一个项目的产品编号和其他详细信息,还有一个包含产品编号、评级和审核的ReviewTable。因为一个项目可以有多个评分和评论,我需要检索该项目的所有评分和评论

 "drop table ProductTable", // The product table


"create table ProductTable ("+
      "productNo      Char(4)," + // Unique product number
      "description    Varchar(40)," +
      "picture        Varchar(80)," +
      "price          Float)",

  "insert into ProductTable values " +
     "('0001', '40 inch LED HD TV', 'images/pic0001.jpg', 269.00)",

 "drop table ReviewTable",
   "create table ReviewTable ("+ 
   "productNo       Char(4)," +
   "ratingScore     Integer,"  +
   "review          Varchar(200))",
   
   "insert into ReviewTable values ( '0001',  2, 'Very high quality, but I had to replace it after 1 year' )",
   "insert into ReviewTable values ( '0001',  3, 'Very good' )", // Two reviews for the same product

   "select * from ReviewTable, ProductTable " +
              " where ReviewTable.productNo = ProductTable.productNo",
我有一个产品对象,它以产品编号、所有评级的数组和评论的数组作为参数:

 public Product(String aProductNum, double[] aRating, String[] aReviews) {
      theProductNum  = aProductNum;     // Product number
        theRating      = aRating;         // ratings of product
        theReviews     = aReviews;        // All the reviews for the product
}
最后,我有一个getDetails方法来检索关于产品的数据,这就是我需要向数组添加多个值的地方

  public synchronized Product getDetails( String pNum )
         throws StockException
  {
    try
    {
        String [] reviews = new String[0]; // Initialise reviews
        double [] ratings = new double[0]; // Initialise ratings
      Product   dt = new Product( "0", ratings, reviews); // Initialise product
      ResultSet rs = getStatementObject().executeQuery(
        "select ratingScore, review " +
        "  from ProductTable, ReviewTable " +
        "  where  ProductTable.productNo = '" + pNum + "' " +
        "  and    ReviewTable.productNo  = '" + pNum + "'"
      );
      if ( rs.next() )
      {
        dt.setProductNum( pNum );            
        dt.setRating(rs.getDouble("ratingScore") ); // CURRENTLY PULLING ONLY ONE RATING
        dt.setReviews(rs.getString("review"));  // CURRENTLY PULLING ONLY ONE REVIEW

      }
      rs.close();
      return dt;
    } catch ( SQLException e )
    {
      throw new StockException( "SQL getDetails: " + e.getMessage() );
    }
  }

需要帮忙吗?提前非常感谢

这是对方法
getDetails
的重写。代码后面的解释

请注意,这完全基于您问题中的细节

公共同步产品getDetails(字符串pNum)
抛出股票异常
{
String sql=“选择评级分数,从ReviewTable中查看,其中productNo=?”;
try(java.sql.Connection conn=java.sql.DriverManager.getConnection(“URL”);
java.sql.PreparedStatement ps=conn.preparest陈述(sql))
{
ps.setString(1,pNum);
结果集rs=ps.executeQuery();
java.util.List ratings=new java.util.ArrayList();
java.util.List reviews=new java.util.ArrayList();
while(rs.next())
{
评级。增加(rs.getDouble(1);
添加(rs.getString(2));
}
double[]ratingsArray=ratings.stream().mapToDouble(double::doubleValue.toArray();
String[]ReviewArray=reviews.toArray(新字符串[]{});
返回新产品(pNum、ratingsArray、ReviewArray);
}捕获(SQLE异常)
{
抛出新的StockException(“SQL getDetails:+e.getMessage());
}
}
  • 您应该使用而不是
    语句
  • 上述代码使用,因为您需要在使用完
    PreparedStatement
    后关闭它
  • 因为您只从数据库表
    ReviewTable
    中检索列,所以我更改了SQL查询
  • 您可以使用
    while
    循环,而不是调用
    if(rs.next())
    ,这样您就可以迭代
    结果集中的所有行
  • 由于您不知道
    结果集中有多少行
    ,请使用
    列表
    存储所有行的详细信息
  • 由于您的类
    产品
    存储的是数组而不是
    列表
    ,因此我将
    列表
    转换为数组。请注意,将
    列表
    转换为
    双[]
    的代码来自以下问题:
  • 现在我有了调用类
    Product
    的构造函数所需的三个参数。因此,我调用构造函数并返回构造函数返回的对象

dt.setRating()
等。似乎只为整个查询重用的
产品
实例设置了一个值。如果要检索多个评论,则需要为此提供代码,例如创建一个
Review
类和一个
addReview(Review)
产品中的方法,然后像
dt.addReview(新评审(评级,评审))一样调用它
使用从resultset中提取的值。稍后,您可能希望为此使用适当的ORM框架,但这就是您可以开始的方式。永远不要构建这样的查询,使用带有占位符的预处理语句。此代码适合SQL注入攻击。@Abra我需要将一个包含所有评级的数组作为参数传递,一个用于所有参数与
Product
类共享相同
productNo
的评论,如果不清楚,很抱歉。我还更改了评论,我的错误-我不需要评分的平均值,而是每个评分的数组。@Abra我从我的原始代码中排除了所有不必要的信息,但忘记了删除该问题抱歉,现在已经更新了,应该可以了。