错误
Before start of result set
解决方法
Resultset对象代表sql语句执行的结果集,维护指向其当前数据行的光标。每调用一次next()方法,光标向下移动一行。最初它位于第一行之前,因此第一次调用next()应把光标置于第一行上,使它成为当前行。随着每次调用next()将导致光标向下移动一行。在Resultset对象及其t父辈Statement对象关闭之前,光标一直保持有效。
函数AVG
构造review表的软删除方法时,将一条记录软删除的,同时统计review表中该mid的平均值。并将平均值赋值给movie表的grade。更新movie表中的grade值。遇到了问题
符合where为空,select语句中的结果集也带有AVG,导致res.next()不为空,所以if中的判断一直为空。经过调试后发现问题
正确代码如下:
/*
* 已软删除review表中记录
* 更新movie中相应的grate
* flag = 0
* 属性值要填满,默认空值也需要
* else后处理不存在评论的情况,将movie中的grade置为0
* 出现错误:即使查询结果为空,也进入if判断的分支中
* 结果集函数AVG
* Resultset对象代表sql语句执行的结果集,维护指向其当前数据行的光标。每调用一次next()方法,光标向下移动一行。
* 最初它位于第一行之前,因此第一次调用next()应把光标置于第一行上,使它成为当前行。随着每次调用next()将导致光标向下移动一行。
* 在Resultset对象及其t父辈Statement对象关闭之前,光标一直保持有效
*/
res = stmt.executeQuery("select avg(grade) avgGrade from review where mid ='"+_review.getMid()+"' and flag = 0");
res.next();//指针指向当前查询内容
System.out.println("影片ID: "+_review.getMid()+" 平均分数: "+res.getFloat("avgGrade"));
num =stmt.executeUpdate("update movie set grade = '"+res.getFloat("avgGrade")+"' where mid = '"+_review.getMid()+"'");
System.out.println("已成功执行"+num+"行,更新movie中grade");
bool=true;
总结
基础不够扎实,发现问题从根本出发,多撸码多总结