如何使用java.sql从sql数据库中提取多个值?
我有一个产品表,其中包含一个项目的产品编号和其他详细信息,还有一个包含产品编号、评级和审核的ReviewTable。因为一个项目可以有多个评分和评论,我需要检索该项目的所有评分和评论如何使用java.sql从sql数据库中提取多个值?,java,sql,arrays,Java,Sql,Arrays,我有一个产品表,其中包含一个项目的产品编号和其他详细信息,还有一个包含产品编号、评级和审核的ReviewTable。因为一个项目可以有多个评分和评论,我需要检索该项目的所有评分和评论 "drop table ProductTable", // The product table "create table ProductTable ("+ "productNo Char(4)," + // Unique pr
"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
- 因为您只从数据库表
中检索列,所以我更改了SQL查询ReviewTable
- 您可以使用
循环,而不是调用while
,这样您就可以迭代if(rs.next())
结果集中的所有行
- 由于您不知道
,请使用结果集中有多少行
存储所有行的详细信息列表
- 由于您的类
存储的是数组而不是产品
,因此我将列表
转换为数组。请注意,将列表
转换为列表
的代码来自以下问题:双[]
- 现在我有了调用类
的构造函数所需的三个参数。因此,我调用构造函数并返回构造函数返回的对象Product
dt.setRating()
等。似乎只为整个查询重用的产品
实例设置了一个值。如果要检索多个评论,则需要为此提供代码,例如创建一个Review
类和一个addReview(Review)
产品中的方法,然后像dt.addReview(新评审(评级,评审))一样调用它
使用从resultset中提取的值。稍后,您可能希望为此使用适当的ORM框架,但这就是您可以开始的方式。永远不要构建这样的查询,使用带有占位符的预处理语句。此代码适合SQL注入攻击。@Abra我需要将一个包含所有评级的数组作为参数传递,一个用于所有参数与Product
类共享相同productNo
的评论,如果不清楚,很抱歉。我还更改了评论,我的错误-我不需要评分的平均值,而是每个评分的数组。@Abra我从我的原始代码中排除了所有不必要的信息,但忘记了删除该问题抱歉,现在已经更新了,应该可以了。